likes
comments
collection
share

为什么IO次数取决于B+树的高度呢?

作者站长头像
站长
· 阅读数 18

首先得具备如下知识点:

这里以数据库查询为例:

  1. 首先得将磁盘中的数据读取到内存中,以16K为最小单位读取(涉及到IO操作)

  2. 在内存中根据查询sql的条件进行查询 (在内存中查找数据,这里涉及到数据结构在MySQL中如何展示的,下次再讲)

  3. 查询的结果进行返回给客户端

第一步就涉及到IO操作,需要读取磁盘上的数据,执行速度很慢,这里是关心的重点。磁盘的耗时是以ms为单位,而内存是ns。所以在有IO操作的前提下,可以忽略掉内存里面消耗的时间

以前我一直误认为数据库里面的数据在内存中是按照B+树排序的,如果是这样子的话,那么如果树的高度为3,但是数据量比较小,都存在与一个数据页中,那么只需要一次IO就可以把数据查询出来,然后在内存中进行查找。那么这里树的高度就与IO操作屁关系没有,只会与数据页的数量存在关系。

后来经过查阅资料,知道了这个B+树原来是由数据页组成的,所以每一个数据页正好对应一次磁盘IO,这就正好能说的通了。

由于目前还不会画图,等以后找到合适的画图工具。这里图的部分可以参考这个文章面试官,请不要再问我MySQL InnoDB B+树底层原理了

B+树一般三四层,这里以三层举例子,比较简单。

最后一层:叶子节点,也就是最底下的节点,是存放数据的,也就是里面存放的是数据库里面一行一行的数据,以数据页为单位存放,数据页之间是以双向链表的结构组成。

第二层:也就是叶子节点往上一层,这里的数据页存放信息的是叶子节点的页号和页内数据主键的最小值,通俗来说,就是叶子节点数据的索引。

第三次:也就是根节点,数据页存放的是第二层的页号和主键的最小值,也就是第二层的索引,通俗来说就是存放的索引的索引。

整体来说,就相当于书的目录,里面有分为章,节,段

文章写得比较浅,只描述了大概的原理。具体细节见参考书籍。

参考:

《MySQL是怎样运行的:从根儿上理解 MySQL》

《MySQL技术内幕-InnoDB存储引擎》

不管学什么语言,建议还是需要看一下操作系统是如何运行的,这里推荐《操作系统导论》,讲的比较通俗易懂。