一、B-Tree
B-Tree结构的1数据可以让系统高效的找到数据所在的磁盘块
为了描述B-Tree,我们先定义一条数据记录为一个二元组[key,data],key为记录的键值,对于不同数据记录,key是互不相同的,data为key对应的值,m阶的B-Tree是满足下列条件的数据结构
1.每个节点最多拥有m个子树
2.根节点至少有两个子树
3.分支节点至少拥有m/2颗子树(除根节点和叶子节点外的都是分支节点)
4.所有叶子节点都在同一层,每个节点最多可以有m-1个key,并且以升序排列
每个节点占用一个磁盘块,一个节点上有两个升序排序的关键字和三个指向子树根节点的指针,指针存储的是子节点所在磁盘块的地址。两个关键词划分成的三个范围域对应三个指针指向的子树的数据的范围域。
以根节点为例,关键字为 17 和 35,P1 指针指向的子树的数据范围为小于 17,P2 指针指向的子树的数据范围为 17~35,P3 指针指向的子树的数据范围为大于 35。模拟查找关键字 29 的过程:根据根节点找到磁盘块 1,读入内存。【磁盘 I/O 操作第 1 次】
比较关键字 29 在区间(17,35),找到磁盘块 1 的指针 P2。
根据 P2 指针找到磁盘块 3,读入内存。【磁盘 I/O 操作第 2 次】
比较关键字 29 在区间(26,30),找到磁盘块 3 的指针 P2。
根据 P2 指针找到磁盘块 8,读入内存。【磁盘 I/O 操作第 3 次】
在磁盘块 8 中的关键字列表中找到关键字 29。
B-Tree存在的问题:
(1)每个节点中有key,也有data,而每一个页的存储空间是有限的,如果data数据较大时就会导致每个节点(即一个页)能存储的key的数量很小
(2)当存储的数据量很大时,同样1会导致B-Tree的深度较大,增加查询时的磁盘I/O次数,进而影响查询效率
二、B+Tree
B+Tree是在B-Tree基础上的一种优化,innoDB存储引擎就是用B+Tree实现其索引结构的
B+Tree中,所有数据记录节点都是按照键值大小顺序存放在同一层的叶子节点上,而非叶子节点上只存储key值信息,这样可以大大加大每个节点存储的key值数量,降低B+Tree的高度,变化点:
(1)数据是存在叶子节点中的
(2)数据节点之间是有指针指向的
通常在B+Tree上有两个头指针,一个指向根节点,另一个指向关键字最小的叶子结点,而且所有叶子节点(即数据节点之间是一种链式环结构),因此可以对B+Tree进行两种查找运算
(1)对于主键的范围查找和分页查找
(2)从根节点开始,进行随机查找
关于Mysql的数据引擎
InnoDB和MyISAM的索引的底层实现都是通过B+Tree来实现的
1、InnoDB中的B+Tree
InnoDB是通过B+Tree结构对ID建索引,然后在叶子节点中存储记录,采用InnoDB引擎的数据存储文件有两个,一个定义文件,一个数据文件。若建索引的字段不是主键ID,则对该字段建索引,然后在叶子节点中存储的是该记录的主键,然后通过主键索引来找到对应的记录
2、MyIsam中索引和数据分别存放在不同的文件,所以在索引树中的叶子节点中存放的数据是该索引对应的数据记录的地址,由于数据与索引不在一起,所以MyIsam是非聚簇索引