参考:
https://zhuanlan.zhihu.com/p/54102723
https://www.sohu.com/a/154640931_478315
MySQL数据库索引主要基于Hash表和B+树
这里先学习B+树
学习B+树之前先了解一下B树
二叉查找树的查询时间复杂度是O(logN)
B树和二叉查找树的比较次数是一样的
数据库索引是存储在磁盘中的, 当数据量大时索引可以达到几个G以上, 索引查询时只能逐页加载到内存中
但由于B树有着更少的磁盘IO读取速度 所以B树查询效率更高
二叉查找树结构:
磁盘IO次数
由于磁盘IO次数是由索引树(二叉查找树)的高度决定的
所以为了减少树的高度, 使其"矮胖",改进成B树
B树是一种多路平衡查找树
它的每一个节点最多包含k个孩子(k是树的阶)
k的大小取决于磁盘页的大小
B树的特征
假设一个m阶B树
1.根节点至少有两个子女
2.每个中间节点都包含k-1个元素和k个孩子,其中m/2<=k<=m
3.每个叶子节点都包含k-1个元素,其中m/2<=k<=m
4.所有叶子节点都位于同一层
5.每个节点的元素从小到大排列, 节点中k-1个元素正好是k个孩子包含的元素的值域分划
这棵树中,咱们重点来看(2,6)节点。该节点有两个元素2和6,又有三个孩子1,(3,5),8.其中1小于元素2,(3,5)在元素2,6之间,8大于(3,5),正好符合刚刚所列的几条特征。
假设现在要查询的数值是5
整个过程中B树并没有比二叉查找树比较次数少(当单一节点元素很多时还会增加比较次数,但内存中的比较和磁盘IO速度比起来可以忽略不计,只要不超过磁盘页大小就可以),但是由于减少了磁盘IO次数,所有提高了查询性能
B-树的插入
当我们要向上面这个B树中插入4时
自顶向下查找4的节点位置,发现4应当插入到节点元素3,5之间。
节点3,5 已经是两个元素的节点了, 无法再增加(3.每个叶子节点都包含k-1个元素,其中m/2<=k<=m)
父节点(2,6) 也无法再增加 根节点9是单元素节点,可以升级为2元素节点 故拆分(3,5) 和(2,6) 让根节点9升级为2节点(4,9) 节点6单独成为第二个子节点
由于增加元素会改变整个B-树的结构 所以B-树能始终维持多路自平衡
B-树的删除
假设我们删除11节点
首先自顶向下查找元素11的节点位置
删除11后, 节点12只有一个孩子, 不符合B-树规范 故找出 12,13,15三个节点的中位数13 替代节点12, 而12成为第一个孩子(左旋)
B-树主要用于文件系统及部分数据库索引 eg:非关系型数据库 MongoDB
而大部分关系型数据库 则使用B+树作为索引 eg:MySQL
B+树(B-树的变体)的特征
1.有K个子树的中间节点包含K个元素(B-树是K-1个), 每个元素不保存数据, 只保存索引, 所有数据都存储在叶子节点中
2.所有的叶子节点包含了全部的数据信息, 及指向这些元素记录的指针, 且叶子节点本身依关键字的大小 自小而大顺序链接
3.所有中间节点都存在于子节点, 在子节点元素中是最大(或最小)的元素
在这颗树中根节点左元素8是左节点中最大的元素, 右元素15是右节点最大元素
(2,5,8)中的8又是右节点的最大元素
需要注意的是, 根节点的最大元素(15) 等于B+树中最大的元素 无论以后怎么删除或增加 最大元素都要保留在根节点中
叶子节点包含了全量元素信息(包括父节点,根节点)
且叶子节点都带有指向下一节点的指针 使他们有序相连
B+树只有叶子节点存储卫星数据(索引元素指向的数据记录),中间节点只是存储索引没有任何数据关联
而B-树则是每个中间节点和叶子节点都存储了卫星数据
B-树中的卫星数据(Satellite Information):
B+树中的卫星数据(Satellite Information):
补充说明:在数据库的聚集索引中, 叶子节点直接包含卫星数据 在非聚集索引中 叶子节点带有指向卫星数据的指针
B+树的优点提现在查询性能上
单元素查询时, B+树会自顶向下逐层查找, 比如查找3
和B-树的区别
1.B+ 树中间节点没有卫星数据, 故同样大小磁盘空间可以容纳更多节点元素(可以更加"矮胖") 磁盘IO次数更少
2.B-树查找只要匹配元素的可,无论是中间节点还是叶子节点,性能不稳定 磁盘IO次数 1-M次
而B+树则每次查找都稳定用时
B-树范围查找
自顶向下,查找到范围的下限(3):
中序遍历到元素6:
中序遍历到元素8:
中序遍历到元素9:
中序遍历到元素11,遍历结束:
B+树的范围查找过程
自顶向下,查找到范围的下限(3):
通过链表指针,遍历到元素6, 8:
通过链表指针,遍历到元素9, 11,遍历结束:
总结B+树优势
1.查询性能更稳定
2.范围查询速度更快
3.单一节点存储元素更多,磁盘IO次数更少(速度更快)