B+Tree
一般的Mysql中使用的B-Tree是B+树,是一种数据结构。
Mysql中,默认的存储引擎 InnoDB 所使用的索引存储结构就是B+树。
页结构
在InnoDB中,单个页的大小为16K,详细的介绍可阅读以下博文:
InnoDB页结构
聚簇索引
聚簇索引指的是在页中以双链表的结构存储基于主键作为索引排序的每一条记录,存储有表中所有数据。
页目录中存储有每一页的页号以及每一页的最小序号。
非聚簇索引
非聚簇索引指的是在页中以双链表的结构存储基于其他属性+主键作为索引排序的每一条记录,只保存其他一个属性和主键!
在按索引查询时,需要基于回表操作。
回表
基于非聚簇索引进行查询时,在查到具体数据后,再按主键从聚簇索引中去查询该条记录的完整数据。
所以,对于默认InnoDB的MySQL数据库而言,每一张表至少有一个索引,既聚簇索引
B+Tree构建过程
B+树的构建过程中,需要保持根节点不变。
B+树在构建过程中,一般深度不超过4。
单个页可存储时
根节点便是页节点,在这个根节点上保存索引[数据]
单个页目录可存储
当单个页存储不下,现需扩充页,并且基于单个页目录可存储时。
- 开辟一个新空间,将根节点中的数据复制后作为一个完整的页;
- 将根节点由页转换为页目录;
- 开辟需要的新空间,将记录按索引要求存储(聚簇或非聚簇索引),将本页的信息添加至页目录(根节点)中。
单个页目录不可存储
当数据量增加至单个页目录不可存储时,需要将根节点由页目录转换为页目录的目录。
- 开辟一个新空间,将根节点中的数据复制后作为一个完整的页目录;
- 将根节点由页目录转换为页目录的目录;
- 开辟需要的新空间,将记录存储后添加至页中;
- 开辟需要的新空间,将页添加至新增页目录中;
- 将新增页目录添加至根节点中。
B-Tree
B树是B+树的基础,其每个节点中都存有数据,除叶节点外,其余的节点结构如下:
{leftNode, minData, midNode, maxData, rightNode}
其中:
- minData:当前节点中索引值较小的那个完整数据;
- maxData:当前节点中索引值较大的那个完整数据;
- leftNode:保存有索引值小于minData的所有数据;
- midNode:保存有索引值介于minData与maxData之间的所有数据;
- rightNode:保存有索引值大于maxData的所有数据;