时间:2021-07-01 10:21:17 帮助过:23人阅读
接上一篇,现在知道记录在页中按照主键大小顺序串成了单链表。
那么我使用主键查询的时候,最顺其自然的办法肯定是从第一条记录,也就是 Infrimum 记录开始,一直向后找,只要存在总会找到。这种在数据量少的时候还好说,一旦数据多了,遍历耗时一定非常长。
于是,作者又想到了一个好办法,灵感来自于书本中的目录。我们翻书的时候想查找一些内容,就会去查看目录,然后直接确定好内容所在的页码。
那么对于 InnoDB 来说,过程如下:
这个地方就是页目录 Page Directory。而上述的地址偏移量就是该记录的真实数据与页面中第 0 个字节之间的距离,这些地址偏移量被称为槽。
每个槽占用 2 字节,页目录就是由多个槽组成。
在上一篇中,创建的表里存在 4 条数据,那么在页中还要算上 Infimum 和 Supremum,共 6 条记录。
这时候 InnoDB 会把它们分出 2 个组:
每个槽中,存放着每个组里最大的那条记录所在页面中的地址偏移量。
从图中,需要关注页目录的一些点:
为什么这 6 条记录要这样分?因为作者对于每组中的记录数量有规定:
现在继续向测试表里插入 12 条数据,也就是说在页中共有 18 条记录。
然后这些记录就被分成了 5 个组,这里参考书籍上的示意图(只保留一些关键属性):
现在,要查找主键是 6 的记录,要如何进行?
因为 5 个槽的编号分别为 0、1、2、3、4 挨着的,并且里面的主键值也都是从小到大进行排序的,可以使用二分法(不清楚的可以百度),那么初始情况下 low=0,high=4:
这里有个问题,槽对应的值都是这个组的主键最大的记录,如何找到组里最小的记录?比如槽 2 对应最大主键是 8 的记录,那如何找到最小记录。
解决办法是:
总结
在一个数据页中查找指定主键值的记录,过程分为 2 步:
【Mysql】InnoDB 引擎中的页目录
标签:mysq 示意图 提取 编号 src mys 目录 主键 strong