针对这个问题,我们继续来画出我们现在所了解的多页的结构图:
文章插图
可以看到,在数据不断变多的情况下,MySQL会再去开辟新的页来存放新的数据,而每个页都有指向下一页的指针和指向上一页的指针,将所有页组织起来(这里修改了一下数据,将每一列的数据都放到了数据区中,其中第一个空格之前的代表id),第一页中存放id为1-5的数据,第二页存放id为6-10的数据,第三页存放id为11-15的数据
需要注意的是在开辟新页的时候,我们插入的数据不一定是放在新开辟的页上,而是要进行所有页的数据比较,来决定这条插入的数据放在哪一页上,而完成数据插入之后,最终的多页结构就会像上图中画的那样 。
多页模式在多页模式下,MySQL终于可以完成多数据的存储了,就是采用开辟新页的方式,将多条数据放在不同的页中,然后同样采用链表的数据结构,将每一页连接起来 。
那么可以思考第四个问题:多页情况下是否对查询效率有影响呢?
多页模式对于查询效率的影响针对这个问题,既然问出来了,那么答案是肯定的,多页会对查询效率产生一定的影响,影响主要就体现在,多页其本质也是一个链表结构,只要是链表结构,查询效率一定不会高 。
假设数据又非常多条,数据库就会开辟非常多的新页,而这些新页就会像链表一样连接在一起,当我们要在这么多页中查询某条数据时,它还是会从头节点遍历到存在我们要查找的那条数据所存在的页上,我们好不容易通过页目录优化了页中数据的查询效率,现在又出现了以页为单位的链表,这不是前功尽弃了吗?
如何优化多页模式由于多页模式会影响查询的效率,那么肯定需要有一种方式来优化多页模式下的查询 。相信有同学已经猜出来了,既然我们可以用页目录来优化页内的数据区,那么我们也可以采取类似的方式来优化这种多页的情况 。
是的,页内数据区和多页模式本质上都是链表,那么的确可以采用相同的方式来对其进行优化,它就是目录页 。
所以我们对比页内数据区,来分析如何优化多页结构 。在单页时,我们采用了页目录的目录项来指向一行数据,这条数据就是存在于这个目录项中的最小数据,那么就可以通过页目录来查找所需数据 。
所以对于多页结构也可以采用这种方式,使用一个目录项来指向某一页,而这个目录项存放的就是这一页中存放的最小数据的索引值 。和页目录不同的地方在于,这种目录管理的级别是页,而页目录管理的级别是行 。
那么分析到这里,我们多页模式的结构就会是下图所示的这样:
文章插图
存在一个目录页来管理页目录,目录页中的数据存放的就是指向的那一页中最小的数据 。
这里要注意的一点是:其实目录页的本质也是页,普通页中存的数据是项目数据,而目录页中存的数据是普通页的地址 。
假设我们要查找id=19的数据,那么按照以前的查找方式,我们需要从第一页开始查找,发现不存在那么再到第二页查找,一直找到第四页才能找到id=19的数据
但是如果有了目录页,就可以使用id=19与目录页中存放的数据进行比较,发现19大于任何一条数据,于是进入id=16指向的页进行查找,直接然后再通过页内的页目录行级别的数据的查找,很快就可以找到id为19的数据了 。
随着数据越来越多,这种结构的效率相对于普通的多页模式,优势也就越来越明显 。
回归正题,相信有对MySQL比较了解的同学已经发现了,我们画的最终的这幅图,就是MySQL中的一种索引结构——B+树 。
B+树的引入B+树的特点我在《令人脱发的数据库底层设计》已经有详细叙述过了,在这里就不重复叙述
我们接着往下聊,我们将我们画的存在目录页的多页模式图宏观化,可以形成下面的这张图:
文章插图
这就是我们兜兜转转由简到繁形成的一颗B+树 。和常规B+树有些许不同,这是一棵MySQL意义上的B+树,MySQL的一种索引结构,其中的每个节点就可以理解为是一个页,而叶子节点也就是数据页,除了叶子节点以外的节点就是目录页 。
这一点在图中也可以看出来,非叶子节点只存放了索引,而只有叶子节点中存放了真实的数据,这也是符合B+树的特点的 。
推荐阅读
- MySQL读写分离?MySQL主从复制原理?如何解决主从同步延时?
- 小黄单车创始人 共享单车巨头
- 坐便器飞小虫子怎么处理,马桶飞虫从哪里出来的
- 梦见水从地下往上冒成了一个池塘 梦见水从地下往上冒,地裂缝
- 闻香识台茶
- 肖光亮,从门外汉到制茶能手
- 梦见车子从很高掉下去醒来心跳很快吓死了 梦见车子从很高掉下去,粉身碎骨
- 郑来荣,昔日庄稼汉 今朝茶老板
- 梦见用担架抬死人,突然人活了 梦见用担架抬死人从我身边路过
- 秋季润燥保健茶方DIY推荐