13.innodb数据页结构02
1.前言
前面我们主要介绍了关于页中的记录的一些详细信息。也就是说记录存储在页中,页是innodb存储引擎的基本存储单元,但是往往我们的数据是非常多的,因此我们的一个页是远远不能满足,所以我们的数据会分散存储在各个页中
2.Page Direcory(页目录)
我们在用select做查询时,按照最笨的方法是从infimum记录开始,沿着单向链表一直地往后找,总有一天会找到,这种方法适用于记录比较少的时候,但是当我们的记录非常多的时候,这种一条条的遍历查找对性能来说是有很大的损耗地,因此,innodb的设计者就发明了一种类似于图书的目录结构用来查找记录的位置。
这种类似于目录结构的制作过程如下:
- 将所有正常的记录(包括infimum和Supremum记录,但不包括已经移除到垃圾垃圾链表中的记录)划分为几个组
- 每个组的最后一条记录(也就是组内最大的那条记录)相当于’带头大哥‘,组内其余的记录相当于’小弟‘。’带头大哥‘记录的头信息中的n_owned属性表示该组内共有几条记录。
- 将每个组中最后一条记录在页面中的地址偏移量(就是该记录的真实数据与页面中第0个字节之间的距离)单独提取出来,按顺序存储到靠近页尾部的地方。这个地方就是Page Directory(页目录)。页目录中的这些地址偏移量称为槽(slot),每个槽占用2个字节。页目录就是由多个槽组成的。
比如说,现在page_demo表中正常的记录就是6条。innodb会把他们分成2个组,第一个组有一个infimum记录,第二组是剩余的5条记录,2个组就对应着2个槽,每个槽中存放每个组中最大的那条记录在页面中的偏移量
上图需要注意几点:
- 页目录部分中有2个槽,也就意味着记录被分成了2个组,槽1中的值是112,代表Supremum记录在页面中的偏移量(就是从页面的0字节开始数,数112字节);槽0中的值是99,代表infimum记录的地址偏移量
- 注意infimum记录和Supremum记录的头信息中的n_owned属性
- infumum记录的n_owned值为1,这表示以infimum记录为最后一个节点的这组中只有1条记录,也就是infimum记录自身
- Supremum记录的n_owned值为5,这表示以Supremum记录为最后一个节点的这个分组中有5条记录,即除了Supremum记录自身之外,还有我们插入的4条记录
- 每个槽占用2个字节,按照对应记录的大小相邻分布。槽对应的记录越小,它的位置就越靠近File Trailer。
上面的有一个问题,就是上面假设地分成了两个组,但是事实上是怎样是怎样进行分组的呢?
设计innodb的大叔对每个分组的记录条数是有规定的:对于infimum记录所在的分组只能有1条记录,Supremum记录所在的分组拥有记录条数只能在1~8条之间,剩下的分组中的记录的条数范围只能是4~8条之间。所以给记录进行分组是按照下面的步骤进行的
1.在初始情况下,一个数据页中只有infimum记录和Supremum记录这两条,它们分属于两个分组,页目录中也只有两个槽,分别代表infimum记录和Supremum记录在页面的地址偏移量
2.之后每插入一条记录,都会从页目录中找到对应记录的主键值比待插入记录的主键值大并且差值最小的槽(从本质上来说,槽是一个组内最大的那条记录在页面中的地址偏移量,通过槽可以快速找到对应的记录的主键值),然后把该槽对应的记录的n_owned值加1,表示本组内又添加了一条记录,直到该组中的记录数等于8个。
3.等一个组中的记录数等于8后,再插入一条记录,会将组中的记录拆分成两个组,其中一个组中4条记录,另外一个5条记录。这个拆分过程会在页目录中新增一个槽,记录这个新增分组最大的那条记录的偏移量。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
2021-02-16 3.axel多线程下载