B+树是在B树基础进一步优化得到的一种数据结构。B+树相比于B树具有更高的查询效率。
定义
- B+树包含2种类型的节点:内部节点(也称索引节点)和叶子节点
- 根节点本身即可以是内部节点,也可以是叶子节点。根节点的关键字个数最少可以只有一个
- B+树与B树最大的不同是内部节点不保存数据,只用于索引,所有数据(或者说记录)都保存在叶子节点中
- M阶B+树表示了内部节点最多有m-1个关键字,阶数M同时限制了叶子节点最多存储m-1个数据
- 内部节点中的key都按照从小到大的顺序排列,对于内部节点中的一个key,左树中的所有key都小于它,右子树中的key都大于等于它。叶子节点中的数据也按照key的大小排列。
- 每个叶子节点都存有相邻叶子节点的指针,叶子节点本身依关键字的大小自小而大顺序链接
如图所示的B+树中,灰色节点代表索引节点中只有key,而不含数据data。橙色节点表示叶子节点,叶子节点中既有key值又有数据data。叶子节点采用单链表的方式链接。
特点
- 索引节点的key值均会出现在叶子节点中
- 索引节点的key值在叶子节点中或者为最大值或者为最小值
- 叶子节点使用单链表的形式链接起来
性能分析
查找性能
1)在相同数量的待查数据下,B+树查找过程中需要调用的磁盘IO操作要少于普通B-树。由于B+树所在的磁盘存储背景下,因此B+树的查找性能要好于B-树。
2)B+树的查找效率更加稳定,因为所有叶子结点都处于同一层中,而且查找所有关键字都必须走完从根结点到叶子结点的全部历程。因此同一颗B+树中,任何关键字的查找比较次数都是一样的。而B树的查找是不稳定的。
插入性能
B+树的插入过程与B树类似,性能也基本一致。
删除性能
删除性能与B树也基本一致。
面试问题
hashmap为什么使用红黑树而不用别的树
红黑树是一个比较特殊的树,跟他能产生对比的是平衡二叉树。但是平衡二叉树的严格平衡牺牲了插入、删除操作的性能,来保证了查询的高效。 而红黑树则采用了折中策略,即不牺牲太大的插入删除性能,同时又保证稳定高效的查找效率。
为什么MongoDB索引使用B树,而MySQL使用B+树
MongoDB是一个非关系型数据库,对于遍历数据的需求很低,更多的是在做一些单一记录查询。而对于MySQL这种关系型数据库来说,进行遍历关联查询的需求就会很高。
结合B树与B+树的特点来说,B树的查询效率不固定,最好的情况是O(1),所以在做单一数据查询时,B树的平均性能会更好。但如果要对B树进行遍历的话,由于各个节点间没有指针相连,所以性能会很低。
而B+树最大的特点是数据只会出现在叶子节点,因此对于单条数据查询,其一定会进入到叶子节点上,因此平均性能没有B树好。但B+树的叶子节点有指针相连,在进行遍历时,其效率会明显优于B树。