首先
B+树的应用最多的就是在MySQL中的索引,是InnoDB存储引擎的默认索引。那么这个在面试中也是经常被问到的。那么就做一个总结吧。
概念
要了解B+树那么就不得不提一下的是B-树,因为B+树和B-树是由很大的联系。
B树(B-tree) 是一种平衡的多路查找树,那么我们从图中也可以看到2-3树的影子,其实2-3树、2-3-4树是B树的一个特例。结点最大的孩子数目称为B树的阶,因此,2-3树是3阶的B树,而2-3-4是4阶的B树。再者B树的每个结点都会存储数据。
我们在来看B+树:
我们首先先比较B树和B+树在结构上的不同,其实整体都是2-3树的形式,但是B+树相对于B树的区别就是在于B+树的叶子结点这一部分,B+树的叶子结点是存储了所有的数据并且是按照非递减的顺序去排序的数据,其他的结点本身不存储数据而是存储指向叶子结点数据的指针
。
B+树的特征
有k个子树的中间节点包含有k个元素(B树中是k-1个元素)
,每个元素不保存数据
,只用来索引
,所有数据都保存在叶子节点。
所有的叶子结点
中包含了全部元素的信息
,及指向含这些元素记录的指针
,且叶子结点本身依关键字的大小自小而大顺序链接。(链表)
- 所有的
中间节点元素都同时存在于子节点
,在子节点元素中是最大(或最小)元素
。 B+树
查找时是从上到下查找
;B-树
则是从下往上查找
(中序遍历)
B+树的优势
-
单一节点存储更多的元素
(这样该节点下分支变多了,树变矮胖了),使得查询的IO次数更少。
- 所有查询
都要查找到叶子节点
,查询性能稳定
。 - 所有叶子节点形成
有序链表
,便于范围查询
。
B-树和B+树的区别?
首先我们上面提到的B+树相对于B树来说最大的不同就是叶子结点存储数据,并且将它们按照非递减的排序
。那么这一个特性可以使得B+树很适合范围查询,并且B树的话它会存在一个回旋查询
的问题,会导致查询的效率降低,那么B+树并不会回旋而是直接进行查询返回范围值。
结语
粗略的总结希望对你有帮助,后期还会继续补充~
收工~