B+树的特点:
- B+树元素自底向上插入,有利于保持平衡
- 非叶子节点的子树指针与关键字个数相同
- 非叶子节点的子树指针p[i],指向关键字值属于[k[i],k[i+1])的子树
- 叶子节点包含有兄弟叶子节点的指针,方便遍历
- 所有关键字都出现在叶子节点的链表中(稠密索引),且链表中的节点都是有序的
- 非叶子节点仅包含关键码信息,不可能在非叶子节点中命中。 非叶子节点相当于是叶子节点的索引(稀疏索引),叶子节点相当于是存储数据的数据层
- 更适合文件索引系统
为什么说B+树比B树更适合实际应用中作为操作系统的文件索引和数据库索引?(优点)
- B+树的磁盘读写代价更低
非叶子节点包含的信息更少。如果把同一节点的所有信息放在一个磁盘块中,则可以比B树放入更多的关键码。一次读入内存当中(读一个块)就能读入更多的关键码,所以降低了磁盘I/O总数 - 查询效率更加稳定
对任何关键字的查找都必须从根节点走到叶子节点,路径长度相同,所以对每条数据的查询效率相当 - B树在提高磁盘I/O性能的同时并没有解决元素遍历效率低下的问题。而B+树因为叶子节点有链指针存在,所以遍历叶子节点即可以实现对整棵树的遍历。而在数据库中基于范围的查询是非常频繁的,B+树就能更好的支持
B+树的缺点:
最大的性能问题是会产生大量的随机IO
随着新数据的插入,叶子节点会慢慢分裂,逻辑上连续的叶子节点在物理上往往不连续,甚至分离的很远。因此作范围查询时,会产生大量随机读IO
对于大量的随机写也一样,举一个插入key跨度很大的例子,如7 -> 1000 -> 3 -> 2000 … ,新插入的数据存储在磁盘上相隔很远,会产生大量的随机写IO
B树的优势体现在要查找的值位于非叶子节点
当到该非叶节点时查找就成功并结束了,而B+树由于非叶节点只是索引部分,这些节点中只含有其子树中的最大(或最小)关键字。因此在B+树中,无论查找成功与否,都是走了一条从根节点到叶子节点的路径