重庆专业微信网站制作,wordpress采集微信公众号,大连做网站优化,深圳app软件开发公司一、页目录和槽 现在知道记录在页中按照主键大小顺序串成了单链表。
那么我使用主键查询的时候#xff0c;最顺其自然的办法肯定是从第一条记录#xff0c;也就是 Infrimum 记录开始#xff0c;一直向后找#xff0c;只要存在总会找到。这种在数据量少的时候还好说#x…一、页目录和槽 现在知道记录在页中按照主键大小顺序串成了单链表。
那么我使用主键查询的时候最顺其自然的办法肯定是从第一条记录也就是 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 挨着的并且里面的主键值也都是从小到大进行排序的可以使用二分法不清楚的可以百度那么初始情况下 low0high4
计算中间槽的位置04/ 22于是查看槽 2 对应记录的主键值为 8因为 8 6所以 high 2low 不变。 重新计算中间槽位置02/ 21于是查看槽 1 对应记录的主键为4因为 4 6所以 high 不变low 1。 因为 high - low 1所以确定主键值为6 的记录就在槽 2 对应的组中。接着找到该组中主键最小的记录沿着单链表向后遍历最终找到主键 6 的记录。 这里有个问题槽对应的值都是这个组的主键最大的记录如何找到组里最小的记录比如槽 2 对应最大主键是 8 的记录那如何找到最小记录。
解决办法是
通过槽 2 找到 槽 1 对应的记录也就是主键为 4 的记录。 主键为 4 的记录的下一条记录就是槽 2 当中主键最小的记录可以找到主键 5。 总结 在一个数据页中查找指定主键值的记录过程分为 2 步
通过二分法确定该记录所在分组对应的槽然后找到该槽所在分组中主键值最小的记录。 通过记录的 next_record 属性比那里该槽所在组的各个记录最终找到目标记录。
总结
感谢每一个认真阅读我文章的人
作为一位过来人也是希望大家少走一些弯路如果你不想再体验一次学习时找不到资料没人解答问题坚持几天便放弃的感受的话在这里我给大家分享一些自动化测试的学习资源希望能给你前进的路上带来帮助。 文档获取方式加入我的软件测试交流群1007119548免费获取~同行大佬一起学术交流每晚都有大佬直播分享技术知识点
这份文档对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库这个仓库也陪伴我走过了最艰难的路程希望也能帮助到你 以上均可以分享只需要你搜索vx公众号程序员雨果即可免费领取