数据库索引为什么使用B-tree或者B+tree,而不是使用AVL树或者RB-Tree?
首先对比B-tree和普通二叉树:
首先B-tree是一种多叉树, 相比于AVL树之类的有序二叉树而言,孩子比较多,元素一定的情况下,孩子越多,高度就越低。
那高度低带来了什么好处呢?
我们都知道磁盘随机IO的速度远远低于内存,所以减少磁盘随机IO就可以大大提高效率。
我们假定树中总共用N个节点, 那么AVL树从根节点到目标节点的最大比较次数应该是Log2(N) ,而B-tree是Logm(N)+m(m是多叉树的兄弟节点数量)。 由于数据是被存储在磁盘上的,从高层到低层每次前进一个节点,都可能产生一次磁盘IO。对于多叉的B-tree而言, 由于多个兄弟节点被存储在同一块磁盘上,所以当到达目标层次之后,一次IO可以读取所有的兄弟节点, 最后m次在兄弟之间比较的逻辑就完全可以在内存中比较了。
简单的说,AVL树可能需要Log2(N)磁盘IO,而B-tree只需要Logm(N)磁盘IO
再对比B-tree和B+tree:
B+tree最大的优势在于将所有数据有序的存放到了叶子节点上, 而所有叶子节点存放了指向下一个叶子节点的指针,因此提供了非常高效的Range操作的能力。
另外,由于B+tree的非叶子节点不再存储具体的数据,只存放叶子节点的指针,因此可以在同一个磁盘块上存放更多的兄弟节点,进一步减小了树的高度,也就减小了磁盘IO的次数。