mysql(六)索引的数据结构

先作抽象定义以下:html

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

B-tree的特色:

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

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

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

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

全部叶节点具备相同的深度,等于树高h。atom

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

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

全部节点组成树结构。xml

每一个指针要么为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

相关文章
相关标签/搜索