面试官问 :索引为什么使用 B+ 树,而不使用 B 树,不使用红黑树呢
首先 B 树和 B+ 树 都是多叉搜索树,然后我们先来观察一下 B+ 树和 B 树的数据结构:
B+ 树的数据结构实现 >>
B 树的数据结构实现 >>
【B+ 树相较于 B 树的优势】
1. IO 次数更少(查询效率更高)
B+ 树的非叶子节点不存放实际的数据,仅存放索引,因此数据量相同的情况下,相比既存储索引又存储数据的 B 树,B+ 树的非叶子节点可以存放更多的索引,所以 B+ 树查询时 IO 次数更少,查询效率更高。
2. 范围查询性能高
B+ 树的叶子节点使用链表相连,有利于范围查询;而 B 树想要进行范围查询时,就只能通过树的深度遍历或广度遍历来完成范围查询,这就会产生更多节点的磁盘 IO,查询效率就低了。
3. 插入和删除性能更好
B+ 树有大量的冗余节点(所有的非叶子节点都是冗余索引),这些冗余索引使得 B+ 树在进行插入和删除操作的时候,效率很高,不会像 B 树那样发生复杂的变化(不断调整节点位置)。
动图演示链接(自己体会):
- B 树:https://www.cs.usfca.edu/~galles/visualization/BTree.html
- B+ 树:https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html
- 导航页:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
那为什么不使用红黑树呢 ??
连 B 树都不用,红黑树就更不用说了。
- 其一,它是二叉树,那么它树的高度就比 B+ 树要高;
- 其二,它在进行插入删除的时候,需要不断的调整树的位置,保证树的平衡性,还需要保证节点的颜色符合红黑树的性质;
- 其三,它的非叶子节点也是不仅要存储索引,还要存储数据,所以它 IO 的次数更多。