1.为什么不是二叉树、红黑树什么的呢?
首先,一般来说,索引本身也很大,不可能全部存在内存中,因此索引往往以索引文件的方式存在磁盘上。然后一般一个结点一个磁盘块,也就是读一个结点要进行一次IO操作。
而二叉树这些树类的数据结构,查找时间主要和树的高度有关,所以虽然一颗AVL树或者是红黑树在查找上比起顺序遍历的O(N)有了比较大的改善,但B树和B+树因为每个结点存的元素更多,所以查询更快,对磁盘的IO操作也更少。
2.为什么是B+树而不是B树呢?
(1)单一节点存储更多的元素(这样该节点下分支变多了,树变矮胖了),使得查询的IO次数更少。
B+树真正的数据都存在叶子结点嘛,也就是上面的结点就简单的索引,就内存会更小,意味着同样的一个页内存大小,所以B+树中,同样的磁盘页大小可以装更多个“索引”,也就是在同样的数据量的情况下,B+树会比B树更加矮胖,因此查询时IO的次数也更加少。
另外,引一点题外话,阶数越大,B树的内存浪费越严重(因为它每个节点的data数据域和sub指针域都有M+1个元素,当该节点只存储了一部分元素时,其他空间都被浪费了),而B+树由于它层数一般在2~4层,所以相对于B树,内存浪费相对较少一点。
(2) 所有查询都要查找到叶子节点,查询性能稳定。
B+树的查询必须查到叶子结点,因为它真正的数据都在叶子嘛,而B树不是,B树只要匹配到那个索引data就好,无论它是在中间结点还是叶子结点,因此B树的查询不是稳定的,最好的情况是只找根节点就行,最坏的情况是找到叶子结点,而B+树的每次查找都是稳定的。
(3)所有叶子节点形成有序链表,便于范围查询。
B树的范围查询十分麻烦,B+树的范围查询只需要在最下面的叶子结点的链表中做遍历就行。