Mysql InnoDB引擎中页目录和槽的查找过程

 更新时间:2022年05月31日 10:38:10   作者:把苹果咬哭的测试笔记  
这篇文章主要为大家介绍了Mysql InnoDB引擎中页目录和槽的查找记录过程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

Mysql InnoDB引擎页目录

一、页目录和槽

接上一篇,现在知道记录在页中按照主键大小顺序串成了单链表。

那么我使用主键查询的时候,最顺其自然的办法肯定是从第一条记录,也就是 Infrimum 记录开始,一直向后找,只要存在总会找到。这种在数据量少的时候还好说,一旦数据多了,遍历耗时一定非常长。

于是,作者又想到了一个好办法,灵感来自于书本中的目录。我们翻书的时候想查找一些内容,就会去查看目录,然后直接确定好内容所在的页码。

那么对于 InnoDB 来说,过程如下:

  • 将所有正常的记录划分为几个组,这里包括那 2 条虚拟记录,但是不包含已经被移除到垃圾链表的记录。
  • 每个组内最后一条记录(也就是最大的那条)就是“大哥”,其他记录都是“小弟”,而“大哥”记录的头信息中的 n_owned 属性表示该组内共有几条记录。
  • 将每个组中最后一条记录在页面中的地址偏移量单独提取出来,按顺序存储到靠近页尾部的地方。

这个地方就是页目录 Page Directory。而上述的地址偏移量就是该记录的真实数据与页面中第 0 个字节之间的距离,这些地址偏移量被称为槽。

每个槽占用 2 字节,页目录就是由多个槽组成。

二、页目录的规定

在上一篇中,创建的表里存在 4 条数据,那么在页中还要算上 Infimum 和 Supremum,共 6 条记录。

这时候 InnoDB 会把它们分出 2 个组:

  • 第一组:只有一个 Infimum 记录
  • 第二组:剩下的 5 条记录

每个槽中,存放着每个组里最大的那条记录所在页面中的地址偏移量。

从图中,需要关注页目录的一些点:

  • 页目录有 2 个槽,说明记录被分为 2 个组。
  • Infimum 记录的 n_owned 属性值为 1,而 Supremum 的为 5。

为什么这 6 条记录要这样分?因为作者对于每组中的记录数量有规定:

  • 对于 Infimum 所在的分组只能有 1 条记录。
  • Supremum 所在的分组只能在 1~8 条之间。
  • 剩下的分组,记录条数范围只能是 4~8 之间。

三、页目录查找记录的过程

现在继续向测试表里插入 12 条数据,也就是说在页中共有 18 条记录。

然后这些记录就被分成了 5 个组,这里参考书籍上的示意图(只保留一些关键属性):

现在,要查找主键是 6 的记录,要如何进行?

因为 5 个槽的编号分别为 0、1、2、3、4 挨着的,并且里面的主键值也都是从小到大进行排序的,可以使用二分法(不清楚的可以百度),那么初始情况下 low=0,high=4:

  • 计算中间槽的位置,(0+4)/ 2=2,于是查看槽 2 对应记录的主键值为 8,因为 8 > 6,所以 high = 2,low 不变。
  • 重新计算中间槽位置,(0+2)/ 2=1,于是查看槽 1 对应记录的主键为4,因为 4 < 6,所以 high 不变,low = 1。
  • 因为 high - low = 1,所以确定主键值为6 的记录就在槽 2 对应的组中。接着找到该组中主键最小的记录,沿着单链表向后遍历,最终找到主键 6 的记录。

这里有个问题,槽对应的值都是这个组的主键最大的记录,如何找到组里最小的记录?比如槽 2 对应最大主键是 8 的记录,那如何找到最小记录。

解决办法是:

  • 通过槽 2 找到 槽 1 对应的记录,也就是主键为 4 的记录。
  • 主键为 4 的记录的下一条记录就是槽 2 当中主键最小的记录,可以找到主键 5。

总结

在一个数据页中查找指定主键值的记录,过程分为 2 步:

通过二分法确定该记录所在分组对应的槽,然后找到该槽所在分组中主键值最小的记录。

通过记录的 next_record 属性比那里该槽所在组的各个记录,最终找到目标记录。

本文参考书籍: 《mysql是怎样运行的》

以上就是Mysql InnoDB引擎中页目录和槽的查找过程的详细内容,更多关于Mysql InnoDB引擎页目录的资料请关注脚本之家其它相关文章!

相关文章

  • MySql escape的使用案例详解

    MySql escape的使用案例详解

    本文通过实际案例给大家介绍MYSQL escape的使用,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2021-09-09
  • MySQL优化案例之隐式字符编码转换

    MySQL优化案例之隐式字符编码转换

    这篇文章主要介绍了MySQL优化案例之隐式字符编码转换,隐式类型转换也会导致同样的放弃走树搜索,更多相关内容具有一定的参考价值,需要的朋友可以参考一下
    2022-07-07
  • idea 设置MySql主键的实现步骤

    idea 设置MySql主键的实现步骤

    在IDE开发工具中也是可以使用mysql的,本文主要介绍了idea 设置MySql主键的实现步骤,文中通过图文的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2024-03-03
  • 常见php与mysql中文乱码问题解决办法

    常见php与mysql中文乱码问题解决办法

    MySQL对中文的支持程度还是很有限的,尤其是新手,但凡出现乱码问题,就会头大。
    2014-09-09
  • MySQL主从复制不一致的原因分析以及解决

    MySQL主从复制不一致的原因分析以及解决

    这篇文章主要介绍了MySQL主从复制不一致的原因分析以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • MySQL数据库优化的六种方式总结

    MySQL数据库优化的六种方式总结

    关于数据库优化,网上有不少资料和方法,但是不少质量参差不齐,所以下面这篇文章主要给大家介绍了关于MySQL数据库优化的六种方式,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-01-01
  • MySQL索引的各种类型

    MySQL索引的各种类型

    这篇文章主要介绍了MySQL索引的各种类型,帮助大家更好的理解和学习MySQL索引,感兴趣的朋友可以了解下
    2020-09-09
  • Navicat for MySQL 15注册激活详细教程

    Navicat for MySQL 15注册激活详细教程

    这篇文章主要介绍了Navicat for MySQL 15注册激活详细教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • MySQL数据库连接查询 join原理

    MySQL数据库连接查询 join原理

    这篇文章主要介绍了MySQL数据库连接查询 join原理,文章首先通过将多张表连到一起查询 导致记录行数和字段列发生变化,利用一对一、一对多和多对多关系保证数据完整性展开主题内容,需要的小伙伴可以参考一下
    2022-06-06
  • Mysql排序的特性详情

    Mysql排序的特性详情

    这篇文章主要介绍Mysql排序的特性,新写了一个功能,自测和测试环境测试都没问题,但在生产环境会出现偶发问题。于是,加班到12点一直排查问题,终于定位了的问题原因:Mysql Limit查询优化导致。现抽象出问题模型及解决方案,分析给大家,避免大家踩坑,需要的朋友可以参考一下
    2021-10-10

最新评论