盛放记录的大盒子 —— InnoDB 数据页结构
1.InnoDB页简介
⻚是MySQL中磁盘和(存储引擎)内存交互的基本单位,也是存储引擎管理存储空间的基本单位
。InnoDB是⼀个将表中的数据存储到磁盘上的存储引擎,所以即使关机后重启我们的数据还是存在的。⽽真正处理数据的过程是发⽣在内存中的,所以需要把磁盘 中的数据加载到内存中,如果是处理写⼊或修改请求的话,还需要把内存中的内容刷新到磁盘上。⽽我们知道读写磁盘的速度⾮常慢,和内存读写差了⼏个数量 级,所以当我们想从表中获取某些记录时,InnoDB存储引擎需要⼀条⼀条的把记录从磁盘上读出来么?不,那样会慢死,InnoDB采取的⽅式是:将数据划分为若 ⼲个⻚,以⻚作为磁盘和内存之间交互的基本单位,InnoDB中⻚的⼤⼩⼀般为 16kb
。也就是在⼀般情况下,⼀次最少从磁盘中读取16KB的内容到内存中,⼀次 最少把内存中的16KB内容刷新到磁盘中。InnoDB为了不同的⽬的⽽设计了许多种不同类型的⻚,用于存放记录的页叫做数据页或者索引页
。
2.数据页(索引页)
1)数据⻚代表的这块16KB⼤⼩的存储空间可以被划分为多个部分,不同部分有不同的功能,各个部分如图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-irkARJCr-1686638428943)(C:\Users\10059\AppData\Roaming\Typora\typora-user-images\image-20220824095148778.png)]
2)从图中可以看出,⼀个InnoDB数据⻚的存储空间⼤致被划分成了7个部分,有的部分占⽤的字节数是确定的,有的部分占⽤的字节数是不确定的。下边我们⽤表格 的⽅式来⼤致描述⼀下这7个部分都存储⼀些啥内容:
名称 | 中文名 | 占用空间大小 | 简单描述 |
---|---|---|---|
File Header | ⽂件头部 | 38字节 | ⻚的⼀些通⽤信息,比如页的编号(随机)、记录上一页和下一页。 |
Page Header | ⻚⾯头部 | 56字节 | 数据⻚专有的⼀些信息 |
Infimum + Supremum | 最⼩记录和最⼤记录 | 26字节 | 两个虚拟的⾏记录(不是用户定义的) |
User Records | ⽤户记录 | 不确定 | 实际存储的⾏记录内容(用户定义的) |
Free Space | 空闲空间 | 不确定 | 数据⻚中尚未使⽤的空间 |
Page Directory | ⻚⾯⽬录 | 不确定 | 记录⻚中的每个分组的最大记录的相对位置,以槽(slot)为单位 |
File Trailer | ⽂件尾部 | 8字节 | 校验⻚是否完整 |
3)记录在页中的存储
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qLVIae5U-1686638428945)(C:\Users\10059\AppData\Roaming\Typora\typora-user-images\image-20220824095748964.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EflQY8qW-1686638428946)(C:\Users\10059\AppData\Roaming\Typora\typora-user-images\image-20220824100205697.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XHks7Mff-1686638428946)(C:\Users\10059\AppData\Roaming\Typora\typora-user-images\image-20220824101554445.png)]
总结:
-
记录在数据页中的存储是以链表的形式,
根据主键从小到大分组存储
,除去最小记录(单独一组)外每8个一组,超过8个就一分为二
。每一组的最大记录对应Page Directory中的一个槽位 -
查找记录时需要先找到具体的页然后再找具体的记录
。根据主键查找记录时,可以使用二分法找到记录所在的槽位(对应的分组)然后通过行记录的记录头信息中的next_record属性遍历该槽所在分组中的各个记录
-
新增更新记录时,如果不是自增长的主键,那么会造成记录的移动(因为要保证从小到大),这样可能就会进而导致索引重建
-
删除记录时,不会把在内存中已经开辟好的空间干掉,等待之后有新的数据进来时,重新排列记录,这样可能就会进而导致索引重建
好的空间干掉,等待之后有新的数据进来时,重新排列记录,这样可能就会进而导致索引重建
- File Header都有上⼀个和下⼀个⻚的编号,所以所有的数据⻚会组成⼀个双链表,顺序也是按照某一页的最小主键的大小顺序来。