为什么Mysql要使用B+树?

153 阅读2分钟

可以跟其他几种索引结构比较

B+树vsHash(范围查询问题)

Hash在做等值查询的时候效率很高,时间复杂度为O(1),但是在做范围查询的时候,O(n),不适合做范围查询

B+树vs平衡二叉树(层数高问题)

如果使用平衡二叉树,每个节点的最大子节点个数为2,使用索引查询的时间复杂度就是O(log2 n),这比B+树高很多,因此需要磁盘IO的次数也多了很多;而且使用平衡二叉树,需要频繁地维护左右子树的高度,控制每个子树的左右高度差不大于1,这是需要消耗性能去维护的,不过即便使用红黑树,也不能解决层数高的问题,红黑树归根结底也是二叉树

对于一个节点树为N的B+树,使用索引查询的时间复杂度是O(logd n),d指的是节点允许的最大子节点的个数;在实际应用中,这个d的值是大于100的,这就意味着千万级别的数据量,B+树的高度仍然能维持在3~4层,一次数据的查询只需要3~4次磁盘IO即可

B+树vsB树(层数高问题)

B+树和B树的根本区别在于:B+树的数据只会存放在叶子节点中,B树的数据不仅存放在叶子节点中,还会存放在非叶子节点中,

所以B+树的非叶子节点的能够存储更多指向下一层节点的目录项记录,在相同的磁盘IO次数下,B+树能够查询更多数据

另外,B+树的叶子节点采用的是双链表结构,适合MySQL的范围查询,而B树只能通过中序遍历去进行范围查找

B+树vs跳表(层数高问题)

跳表的查询效率与它的层级有关,如果层级太低,那么通过每一层能够筛选掉的数据可能就少了(只有一层就O(n)了)

假如要存储两千万条数据,如果要维持O(log2 n),理论上需要24层,如果每一层的数据都在不同的数据页,那么查询一条数据就需要经过24次磁盘IO

当然这是理想的情况,跳表是否往上建立索引,完全靠随机函数,这就导致了在一次数据查询的时可能经过不确定次数的磁盘IO

也正是这种高层级不确定的磁盘导致查询数据时,性能受到较大的影响