MySQL索引结构采用B+树的因

今天看了好多关于MySQL索引的文章,对MySQL的索引结构采用B+树的原因进行梳理。

首先来回顾一下数据结构课程中学过的一些树的结构。

一、二叉查找树

1.1 性质

  • 任意节点左子树不为空,则左子树的值均小于根节点的值;
  • 任意节点右子树不为空,则右子树的值均大于于根节点的值;
  • 任意节点的左右子树也分别是二叉查找树;
  • 没有键值相等的节点; 

《MySQL索引结构采用B+树的因》

上图为一个普通的二叉查找树,按照中序遍历的方式可以从小到大的顺序排序输出:2、3、5、6、7、8。

对上述二叉树进行查找,如查键值为5的记录,先找到根,其键值是6,6大于5,因此查找6的左子树,找到3;而5大于3,再找其右子树;一共找了3次。如果按2、3、5、6、7、8的顺序来找同样需求3次。用同样的方法在查找键值为8的这个记录,这次用了3次查找,而顺序查找需要6次。计算平均查找次数得:顺序查找的平均查找次数为(1+2+3+4+5+6)/ 6 = 3.3次,二叉查找树的平均查找次数为(3+3+3+2+2+1)/6=2.3次。二叉查找树的平均查找速度比顺序查找来得更快。

1.2 局限性

一个二叉查找树是由n个节点随机构成,所以,对于某些情况,二叉查找树会退化成一个有n个节点的线性链。如果我们的根节点选择是最小或者最大的数,那么二叉查找树就完全退化成了线性结构。显然这个二叉树的查询效率就很低,因此若想最大性能的构造一个二叉查找树,需要这个二叉树是平衡的(这里的平衡从一个显著的特点可以看出这一棵树的高度比上一个输的高度要大,在相同节点的情况下也就是不平衡),从而引出了一个新的定义-平衡二叉树AVL。

二、AVL树(平衡的二叉查找树)

2.1 特性

AVL树是带有平衡条件的二叉查找树,一般是用平衡因子差值判断是否平衡并通过旋转来实现平衡,左右子树高度差不超过1,和红黑树相比,它是严格的平衡二叉树,平衡条件必须满足(所有节点的左右子树高度差不超过1)。不管我们是执行插入还是删除操作,只要不满足上面的条件,就要通过旋转来保持平衡,而旋转是非常耗时的,由此我们可以知道AVL树适合用于插入删除次数比较少,但查找多的情况。 

2.2 局限性

由于维护这种高度平衡所付出的代价比从中获得的效率收益还大,故而实际的应用不多,更多的地方是用追求局部而不是非常严格整体平衡的红黑树。当然,如果应用场景中对插入删除不频繁,只是对查找要求较高,那么AVL还是较优于红黑树。

三、红黑树

关于红黑树,具体可以看我另一篇博客:https://my.oschina.net/edwardge/blog/1833893

由于红黑树本质上还是二叉树,高度还是太高,作为索引的数据结构并不合适。

四、B树/B+树

我们知道MySQL的数据是存放在磁盘上的,而读取磁盘的IO开销非常大,当需要定位到磁盘的具体位置时就需要几次IO操作,所以每次进行查找时就要想办法尽量控制对磁盘的IO操作次数,而B+树的结构正好满足。B/B+树是为了磁盘或其它存储设备而设计的一种平衡多路查找树(相对于二叉,B树每个内节点有多个分支),与红黑树相比,在相同的的节点的情况下,一颗B/B+树的高度远远小于红黑树的高度(在下面B/B+树的性能分析中会提到)。B/B+树上操作的时间通常由存取磁盘的时间和CPU计算时间这两部分构成,而CPU的速度非常快,所以B树的操作效率取决于访问磁盘的次数,关键字总数相同的情况下B树的高度越小,磁盘I/O所花的时间越少。

那么为什么采用B+树而不是B树呢?

我们先来看两者结构上的区别:

《MySQL索引结构采用B+树的因》

《MySQL索引结构采用B+树的因》

  • B+树的磁盘读写代价更低,因为B+树的所有非叶子节点只会存放索引信息,而真正的数据信息都只存放在叶子节点中,这样一来,每个非叶子节点存放的索引信息就更多,一次磁盘IO就可以读取更多的索引信息到内存中,可以减少磁盘IO的次数。
  • B+树的查询效率更加稳定,由于非叶子节点只存索引信息,而没有真正的数据信息,所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。
  • B+树更加适合在区间查询的情况,由于B+树的数据都存储在叶子结点中,非叶子结点均为索引,只需要扫一遍叶子结点即可得到所有数据信息,但是B树因为其非叶子结点同样存储着数据,我们要找到具体的数据,需要进行一次中序遍历按序来扫,所以B+树更加适合在区间查询的情况,所以通常B+树用于数据库索引。

部分内容参考以下博客:

https://www.jianshu.com/p/4dbbaaa200c4

https://www.cnblogs.com/tiancai/p/9024351.html

    原文作者:红黑树
    原文地址: https://my.oschina.net/edwardge/blog/1934165
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞