MySQL为什么使用B+树以及什么是覆盖索引和回表

目录

B+树

什么是B+树

B+树的特性

        节点有序性

        数据聚集性

        查询稳定性

        高扇出性

MySQL为什么选择B+树

        从范围查询的角度

        从插入和删除的角度

        从磁盘I/O的角度

什么是回表和覆盖索引

        回表

        覆盖索引

最后

 

        在开搞MySQL为什么使用B+树之前,我们先来简单了解一下B+树到底是什么。

B+树

        什么是B+树

        B+树简单来说就是一种自平衡的多叉树形数据结构,自平衡就是说它的左右高度差不超过1,多叉的意思就是它的每一个非叶子结点都可以有多个节点,我把它简单理解成有多只手,可以伸到很多地方,二叉树就像一个人一样,只有两只手,多叉树就像千手观音一样,可以有很多只手。

        B+的所有数据都存储在叶子节点,非叶子结点只存储键值和子节点的指针,叶子节点直接通过指针相互连接,形成一个有序链表,这个有序链表使得B+树在范围查询上有很大的优势,每个节点可以存储多个键值,键值之间是有序的。

        简单说完B+树是什么鬼东西,接下来我们来简单了解一下B+树的特点。

        B+树的特性

        节点有序性

        B+树的节点内部的键值和叶子节点的数据都是有序的,这让B+树可以高效的进行范围查询。

        数据聚集性

        B+树的数据全部存储在叶子节点,且叶子节点之间通过指针相连,形成有序的链表结构,数据在物理存储层面是聚集的,有利于提高查询的效率。

        查询稳定性

        由于B+树多叉、一个节点可以存储多个键值,只在叶子节点存储数据的特点,使得B+树的高度一般较低,就像个矮胖子一样(身高1米五,体重二百五),所以B+树即使存储的数据量急剧的不断的增大,B+树的查询性能也不会受到太大的影响。

        高扇出性

        B+树的每个节点可以存储大量键值,每个键值又指向了一个子节点,使得B+树能存储的数据量及其庞大,同时还极大的减低了树的高度。

        我们都知道,数据一般都是存储在磁盘中的,磁盘扇区是磁盘最小的数据存储单位,B+树低高度和数据量大集中的特点,使得一个扇区之中可以存储大量的数据或者指引我们找到数据的键值,通过B+树查询一个数据时,可以通过较少的磁盘I/O的次数完成查询。

        我对高扇出性的理解就是小扇区高产出,或者说小扇区高效率(不知道我的理解对不对,如果大家有其他看法的,也可以留言跟我分享一下)。

        简单的介绍完B+树的特性之后,我们终于可以来回答标题的前半部分——MySQL为什么选择B+树了。

MySQL为什么选择B+树

        从范围查询的角度

        我们平时使用MySQL的时候,经常要用到等值查询和范围查询,等值查询就不用多说了,而范围查询就不是什么数据结果都能很好的适配的了。

        上面我们介绍了,B+树的数据全都存储的叶子节点,且叶子节点直接通过指针相连形成有序链表,天然适合范围查询。MySQL的Innodb存储引擎(我们常用的那个)的B+树使用双向链表来连接存储在叶子节点中的数据,使得通过B+树进行范围查询的时候,既可以往前探探头看看是不是我要的数据,也可以往后踢一脚,看看是不是我要的数据。

        如果大家了解过B数和二叉树,还可以发现B+树的另一个优点。那就是B+树不用回到根节点再从根节点跑到叶子节点来进行范围查询,通过横向的指针使得它可以横向的直接进行范围查询。

        从插入和删除的角度

        B+树上有大量的冗余节点(所有的非叶子节点都是冗余节点),这些冗余的节点使得B+树在插入和删除操作的时候,树的结构不会发生太过复杂的变化,效率更高,如果是什么AVL树、B树啥的,很大可能还要进行树的左旋右旋等操作来改变树的结构来维持自平衡和数据索引之间的顺序,大大降低了数据库的效率。

        从磁盘I/O的角度

        MySQL的数据是持久化在磁盘的,树的高度决定了磁盘I/O的次数,由于磁盘是一个很慢的存储设备,因此磁盘I/O的次数在很大程度上决定了MySQL的查询性能。

        B+树的非叶子节点不存放数据,相比于B树等其它数据结构,能够存储更多的索引和数据,因此B+树相比于其他数据结构更加"矮胖",就非常符合mysql对低磁盘I/O的提高数据查询速度的需求。

        搞定完MySQL为什么选择B+树,最后我们再来简单的介绍两个有意思的概念——回表和覆盖索引。

什么是回表和覆盖索引

        回表

        当一个查询语句使用到二级索引进行查询时,如果二级索引树里不包含查询语句所需的所有字段,则MySQL会在二级索引树上查询到所需数据的主键索引后,到主键索引树中查询所需的数据字段。这个从二级索引查主键索引,再通过主键索引查询数据的过程就叫做回表;

        覆盖索引

        如果二级索引树中的数据能够满足查询语句所需的所有字段,则MySQL直接使用二级索引中的数据返回给客户端,不需要再去主键索引树中获取数据,这个直接从二级索引拿到数据返回的过程就叫做覆盖索引。

        从上面的回表和覆盖索引的描述中,我们可以得出一个结论:如果只使用二级索引就查到所需数据的情况,就是覆盖索引;使用二级索引树后还需要到主键索引树中取数据的情况,就是回表。

最后

        最后,谢谢大家看完我的文章,前面的MySQL为什么选择B+树和最后的回表和覆盖索引,一个我觉得很杂但比较枯燥,一个我觉得很简短但很有意思,我就把它们放一起了,看似没什么逻辑上的关系,其实本来就没有。

        哈哈哈哈哈哈哈哈哈。拜拜啦各位,我去吃夜宵了。祝大家,学习的学啥都会,工作的很快就能升职加薪。溜了溜了~

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值