InnoDB的数据页到底长什么样?

310 阅读3分钟

我们执行crud的时候,都会从磁盘上加载数据页到Buffer Pool的缓存页上去,更新了缓存页后,又会刷新回磁盘上的数据页里去。

InnoDB进行数据操作的最小单位,就是数据页,那么我们之前已经给大家分析过了一行一行数据在磁盘和缓存中存储,具体格式是什么样的。

图片

每个数据页默认是16K,是不是每个数据页里边就是一行一行的数据呢?

没这么简单!

数据页会分为很多个部分,大体上来说分为文件头、数据页头、最小记录最大记录、数据行、空闲空间、数据页目录、文件尾部。​

图片

各部分含义详细介绍:

名称

中文名

占用空间大小

简单描述

File Header

文件头部

38字节

页的一些通用信息

Page Header

数据页头部

56字节

数据页专有的一些信息

Infimum + Supremum

最小记录和最大记录

26字节

两个虚拟的行记录

User Records

数据行

不确定

实际存储的行记录内容

Free Space

空闲区域

不确定

页中尚未使用的空间

Page Directory

数据页目录

不确定

页中的某些记录的相对位置

File Trailer

文件尾部

8字节

校验页是否完整

​通过上图这种特殊的存储格式,InnoDB在磁盘文件里存放了一个又一个的数据页,每个数据页在磁盘里实际存储的,就是包含了上述一些特殊的数据。每个数据页里还有专门的区域包含了多行数据,每个数据行,就是用图1的格式来存储的了。

当我们第一次插入数据到数据页的时候,数据页可能是空的,这时候的数据页是没有数据行那个区域的。​

图片

假如我们现在要插入一行数据,此时数据库里一行数据都没有的。

当向缓存页里插入一条数据时,实际上就是在数据行那个区域里插入一行数据,然后空闲区域的空间会减少一些,此时当缓存页插入了一行数据后,此时缓存页看起来就像这样了。

​​图片

随着不停的crud,就会不停的插入数据到这个缓存页里去,直到空闲区域耗尽,这个页就写满了,此时数据行去也就会有很多行数据。​​

图片

在更新缓存页的同时,它在lru链表里的位置也会不停的变动,而且肯定会在flush链表里,所以最终它会通过后台的IO线程把这个缓存页刷到磁盘上去。

对数据页内部结构的介绍就差不多了,后边还会介绍InnoDB对数据页的管理,表空间这些概念。

END

如果你喜欢本文,请关注 南山的架构笔记