一、页文件目录和槽

接好一篇,如今了解纪录在页中依照外键约束尺寸次序连接成了单链表。

那麼我应用外键约束查看的情况下,最随遇而安的方法毫无疑问是以第一条纪录,也就是 Infrimum 纪录逐渐,一直向后找,只需存有总是会寻找。这类在信息量少的情况下还行说,一旦数据信息多了,解析xml用时一定十分长。

因此,创作者又想起了一个好方法,设计灵感来自于书籍中的文件目录。大家翻开书的情况下想搜索一些內容,便会去查看目录,随后立即明确好內容所属的页数。

那麼针对 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:

  1. 测算正中间槽的部位,(0 4)/ 2=2,因此查询槽 2 相匹配纪录的主键值为 8,由于 8 > 6,因此 high = 2,low 不会改变。
  2. 再次测算正中间槽部位,(0 2)/ 2=1,因此查询槽 1 相匹配纪录的外键约束为4,由于 4 < 6,因此 high 不会改变,low = 1。
  3. 由于 high - low = 1,因此明确主键值为6 的纪录就在槽 2 相匹配的组里。然后寻找这种情况中外键约束最少的纪录,顺着单链表向后解析xml,最后寻找外键约束 6 的纪录。

这儿有一个难题,槽相匹配的值全是这一组的外键约束较大 的纪录,怎样寻找组里最少的纪录?例如槽 2 相匹配较大 外键约束是 8 的纪录,那怎样寻找最少纪录。

解决方案是:

  • 根据槽 2 寻找 槽 1 相匹配的纪录,也就是外键约束为 4 的纪录。
  • 外键约束为 4 的纪录的下一条纪录便是槽 2 之中外键约束最少的纪录,能够 寻找外键约束 5。

汇总
在一个数据信息页中搜索特定主键值的纪录,全过程分成 2 步:

  1. 根据二分法明确该纪录所属排序相匹配的槽,随后寻找该槽所属排序中主键值最少的纪录。
  2. 根据纪录的 next_record 特性比那边该槽所属组的每个纪录,最后寻找总体目标纪录。



文中参照书本: 小朋友4919 《mysql是怎样运行的》
--不能用肉身的努力,去遮盖思索的懒散--

评论(0条)

刀客源码 游客评论