数据库B+ Tree

382 阅读1分钟

B+ Tree 是B Tree family中的一种。和B Tree不一样的是:(1)所有真正的数据都存在叶子节点,非叶子节点存贮的只是索引。(2)允许在这个树存在重复的key。插入和删除的复杂度为log(N) 级别。

一棵B+ Tree的样例图

![](https://upload-images.jianshu.io/upload_images/23475747-141af30dbef82ef7.png?imageMogr2/auto-orient/strip|imageView2/2/w/780/format/webp)

优势:

B+tree的磁盘读写代价更低:B+tree的内部结点并没有指向关键字具体信息的指针,因此其内部结点相对B 树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多,相对来说IO读写次数也就降低了;

B+tree的查询效率更加稳定:由于内部结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引,所以,任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当;

数据库索引采用B+树而不是B树的主要原因:B+树只要遍历叶子节点就可以实现整棵树的遍历,而且在数据库中基于范围的查询是非常频繁的,而B树只能中序遍历所有节点,效率太低