Innodb资料页结构-Part1(使用者纪录、空闲空间、页面中最小与最大的纪录)

前文提到页是Innodb的基本存取单位,一般为16kb,Innodb为了实现功能其实设计了许多不同类型的页,但我们不管那麽多,今天就只探讨我们最关心的储存记录的页(资料页),官方又叫作索引(index)页。

资列页(16kb大小)的结构有7个部分

  1. 使用者纪录(user records)
  2. 空闲空间(free space)
  3. 页面中最小与最大的纪录(infimum+supermum)
  4. 页面目录(page directory)
  5. 页面标头(page header)
  6. 档案表头(file header)
  7. 档案结尾(file trailer)

使用者纪录(user records)、空闲空间(free space)、页面中最小与最大的纪录(infimum+supermum)

在资料页内储存一笔纪录的流程为先向free space申请空间(一开始生成页的时候并没有user records区块),
再将空间划分到user records去,当所有的free space都被划分到user records後,如果还有新纪录要储存就要另外生成新的资料页。

前文提到资料内的标头资讯很重要,今天要再详细说明。

heap_no(表示目前纪录在页面堆叠中的相对位置)

设计Innodb的工程师把新增的每一笔资料紧密无间的摆放在一起,称其为堆叠(heap)。

每笔纪录在堆叠中的相对位置称为heap_no(是一个数字 ex:2),在页面前面的heap_no值相对较小,在页面後面的heap_no值相对较大,每新申请一笔纪录的储存空间时,该笔纪录比物理位置在它前面的那笔纪录heap_no值大1。

还有一个地方要注意,增加一笔纪录到新生成的页面时,页面会自动再增加两笔虚拟纪录(infimum+supermum页面中最小与最大的纪录,不论插入多少纪录也不管其主键值大小,infimum就是页面中最小的纪录,supermum就是页面中最大的纪录,这是规定!记住就对了!)

所以当我们插入两笔资料时

mysql> insert into ryan_demo_table(c1,c2,c3,c4) values ('aaaa','bbb','cc','d'),('eeee','fff',NULL,NULL);
Query OK, 2 rows affected (0.02 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from ryan_demo_table;
+------+-----+------+------+
| c1   | c2  | c3   | c4   |
+------+-----+------+------+
| aaaa | bbb | cc   | d    |
| eeee | fff | NULL | NULL |
+------+-----+------+------+
2 rows in set (0.00 sec)

这两笔纪录heap_no值分别会是2跟3(页面自动再增加2笔虚拟纪录infimum[heap_no:0]+supermum[heap_no:1]),而不是0跟1。

next_record

这属性顾名思义就是用来找到下笔纪录的,存放的是与下笔纪录的真实距离(ex:3 从该笔纪录往後找3个位元组会找到下笔纪录),对於资料结构有点概念就会知道它是链结串列(透过一笔纪录找到下一笔纪录)。这边要注意的是下笔纪录并不是插入顺序的下笔纪录,而是资料照着主键值大小排序後,排在其後的下笔纪录。
而infimum的下笔纪录就是user records中主键最小的那笔,user records中主键最大那笔的下笔纪录就是supermum,supermum的下笔纪录就是0。

deleted_flag

先认知Innodb储存纪录的结构就是一个按照主键大小排序的单向链结串列。
当我们删掉其中一笔资料A,资料改变的只有3个地方(不包含n_owned的部分,这之後会再说明)。

  1. 资料A并不会从储存空间中移除,而是deleted_flag变成1
  2. 资料A的next_record变成0
  3. 指向资料A的纪录变成指向本来资料A的next_record

当资料页出现多笔被删除的纪录,可以透过next_record属性组成一个垃圾链结串列。
再来还有一个值得注意的是如果我们之後新增资料,则会重复利用deleted_flag变成1的删除纪录,并不会重新申请新的储存空间唷。


<<:  多层次纵深防御下失守案例的有效改善对策

>>:  Day5 请多关怀边缘人

Windows Event探索练习--开关机和Office的大小事件

今天要来研究一些常见的事件,来看看有那些东西会被系统纪录下来,他们的意义又是什麽。 笔者查了查发现不...

Day 29. Hi-Fi Prototype-以 Figma 制作高精度原型 (下)

由於 Figma 的核心是 GUI 设计工具,附带原型制作能力,所以一般来说我们都会使用它来进行高精...

Day.5 Slide Window

Leetcode #209. Minimum Size Subarray Sum 简单来说题目会给一...

Day14 - 动态 新增/删除 Collection 项目(二) - Html Helper

这篇调整的方向是 透过 Partial View 来 Render Collection 项目 透过...

Day 4 | Activity

画面转换 Intent是应用程序元件(Activity、Service、BroadcastRecei...