search 2013 adfgs
作者:Sky.Jian | 可以任意转载, 但转载时务必以超链接形式标明文章原始出处 和 作者信息 及 版权声明
链接:http://isky000.com/database/myisam-index-structure | del.icio.us | Twitter it

在此之前曾经写过一篇介绍 “Innodb 索引结构了解 – Innodb Index Structure” 的文章,这次再接着分析一下 MyISAM 存储引擎索引的基本存储结构。

从索引基本的存放数据结构来说,MyISAM 的索引不论是 Primary Key 还是普通 Index,存储结构都基本一样,基本结构都是 Balance Tree (简称为 B-Tree),所有的键值详细信息和行“指针”信息都存放于 B-Tree 的 Leaf Nodes 上面。这个基本的数据结构和 MySQL 的其他存储引擎如 Innodb 也基本相同。但是,MyISAM 的索引并不像 Innodb 存储引擎那样 Primary Key 和 Secondary Index 中存放的数据存在较大区别。在 MyISAM 存储引擎中,Primary Key 和其他的普通 Index 的主要区别仅仅在于 Primary Key 的索引键需要满足是非空的唯一值而已,另外一个区别其实也是每一个普通索引之间都存在的区别,就是整个索引树的键值排列顺序不太一样。

由于 MyISAM 存储引擎中数据行的存储分为固定长度和动态长度两种,所以在 MyISAM 存储引擎的数据文件中定位一行数据所需要信息也存在两种方式。一种是直接通过行号(row number)来定位固定长度表数据的行,另外一种是通过其他一些相对的文件位置标识信息来定位动态长度表数据的行,这里我们姑且将两种方式统称为RID(Row ID)吧。

下面这张图片展示了 MyISAM 索引的基本存储方式:

myisam index structure

myisam index structure

, , ,

已经有7个回复

  1. Leslie Says @ 09-07-17 2:45 pm

    “Both leaf and nonleaf nodes contain key values and pointers to the record positions
    in the datafile. Nonleaf nodes additionally contain pointers to child nodes.” (摘自Understanding MySQL Internals)
    似乎跟楼主说的不一样…

  2. arlen Says @ 10-06-4 2:26 pm

    b-tree的关键字是分布在整棵树中的,而b+tree的关键字只在叶节点。
    由此可得,myisam和innodb的索引都是b+tree。不知道朝阳认为这个观点是否正确?

  3. arlen Says @ 10-06-4 2:54 pm

    “Both leaf and nonleaf nodes contain key values and pointers to the record positions
    in the datafile. Nonleaf nodes additionally contain pointers to child nodes.” (摘自Understanding MySQL Internals)
    似乎跟楼主说的不一样…

    这是《Understanding MySQL Internals》书中在讲myisam的b-tree的时候的一段话。
    由此,可以得出myisam的索引是b-tree。

    而innodb的索引是不是b+tree,尚待验证

Trackbacks & Pingbacks

看完了要说点啥么?