mysql(六)索引的数据结构

先做抽象定义如下:

定义一条数据记录为一个二元组[key, data],key为记录的键值,对于不同的数据记录,key是互不相同的;data为数据记录除key外的数据。

B-tree的特点:

d为大于1的一个正整数,称为B-Tree的度(度可以理解为空间一定的条件下内节点的有效容量,与key大小和data大小有关)。

h为一个正整数,成为B-Tree的高度。

每个非叶子节点由n-1个key和n个指针组成,其中d<=n<=2d。

每个叶子节点最少包含一个key和两个指针,最多包含2d-1个key和2d个指针,叶节点的指针均为null。

所有叶节点具有相同的深度,等于树高h。

key和指针互相间隔,节点两端是指针。

一个节点中的key从左到右递增排序。

所有节点组成树结构。

每个指针要么为null,要么指向领一个节点。

每个节点申请同等大小的空间。

如果某个指针在节点node最左边且不为null,则其指向节点的所有key小于v(key1)v(key1),其中v(key1)v(key1)为node的第一个key的值。

如果某个指针在节点node最右边且不为null,则其指向节点的所有key大于v(keym)v(keym),其中v(keym)v(keym)为node的最后一个key的值。

如果某个指针在节点node的左右相邻key分别是keyikeyi和keyi+1keyi+1且不为null,则其指向节点的所有key小于v(keyi+1)v(keyi+1)且大于v(keyi)v(keyi)。

按key检索数据的算法:从根节点进行二分查找,找到则返回对应节点的数据,否则对相应区间的指针指向的节点递归进行查找,直到找到节点或找到null指针。前者查找成功,后者查找失败。

B+tree的特点:

内节点不存储data,只存储key。

叶子节点不存储指针。

叶子节点与内节点一般大小不同。

叶子节点增加一个指向相邻叶子节点的指针,就形成了带有顺序访问指针的B+Tree。通过这种方式,可以提高区间访问的性能。

基于B+tree的特点,内节点不存储data,意味着出度可以比B-tree更高,而出度越大,索引性能越好。

MyISAM

MyISAM叶子节点的data域存放的是数据记录的地址,检索索引时,如果指定的key存在,则取出data域的地址,然后用这个地址读取记录。这种索引方式叫做“非聚集”。

InnoDB

InnoDB主索引的叶子节点包含了完整的数据记录,这种索引叫做聚集索引。InnoDB的表必须有主键,没有显示指定,系统会自动选择一个列,如果不存在这种列,则自动生成一个隐含字段作为主键。

InnoDB辅助索引data域存储相应记录主键的值而不是地址。

参考文章:http://blog.codinglabs.org/articles/theory-of-mysql-index.html

猜你喜欢

转载自www.cnblogs.com/asfeixue/p/9244718.html