mysql - 页
1 页的基本概念
-
在一个数据库中创建一张表时,此时就会生成一个.ibd文件,一张表对应一个.ibd文件,而页就是.ibd文件中最重要的结构体。
-
在 InnoDB 中,默认页大小是 16 KB(可以通过innodb_page_size参数修改为4KB、8KB、32KB 或 64KB)。
-
在MySQL中,页是内存与磁盘交互的最小单元。
- InnoDB 与磁盘交互,每次读取的最小单位是一页(16KB)。查一行,也会把那查一行所在的 16KB 全部加载进来。
InnoDB 向磁盘写入数据,每次写入的最小单位也是一页。内存中修改了页里的一行,刷新到磁盘时,也是重写整个 16KB。
- InnoDB 与磁盘交互,每次读取的最小单位是一页(16KB)。查一行,也会把那查一行所在的 16KB 全部加载进来。
2 页的内部结构

一个典型的 InnoDB 数据页包含以下部分:
| 部分 | 说明 |
|---|---|
| File Header | 页的通用头信息,如上一页/下一页指针(用于双向链表)、页类型、LSN 等。 |
| Page Header | 数据页特有的头信息,如记录数量、空闲空间起始位置等。 |
| Infimum + Supremum | 两个虚拟记录,分别代表最小和最大边界,用于遍历记录。 |
| User Records | 实际存储的用户数据行(按主键排序)。 |
| Free Space | 未使用的空间,用于插入新记录。 |
| Page Directory | 页目录,用于快速定位记录(稀疏索引,加速页内二分查找)。 |
| File Trailer | 页尾,包含校验和等信息,用于验证页完整性。 |
2.1 File Header
File Header(文件头)是 InnoDB 页结构中位于最前端的一部分(通常占用 38 字节)。它的主要作用是管理页与页之间的逻辑关系,而不是存储具体的用户数据。
| 字段名 | 大小 | 作用 |
|---|---|---|
FIL_PAGE_SPACE |
4 字节 | 表空间 ID。标识这个页属于哪个表空间(即哪个 .ibd 文件)。 |
FIL_PAGE_OFFSET |
4 字节 | 页号。表示这是该表空间中的第几个页(从 0 开始编号)。 |
FIL_PAGE_PREV |
4 字节 | 前一页的页号。指向双向链表中的前一个页。如果是第一个页,则为 FIL_NULL(0xFFFFFFFF)。 |
FIL_PAGE_NEXT |
4 字节 | 后一页的页号。指向双向链表中的后一个页。如果是最后一个页,则为 FIL_NULL。 |
FIL_PAGE_LSN |
8 字节 | 日志序列号。记录最后修改该页时的 redo log LSN,用于崩溃恢复时判断是否需要重放日志。 |
FIL_PAGE_TYPE |
2 字节 | 页类型。标识这是数据页、索引页、Undo 页还是系统页等。 |
FIL_PAGE_FLUSH_LSN |
8 字节 | 刷盘 LSN。仅在第 0 号页(空间头页)有效,记录整个表空间最后刷盘的 LSN。 |
FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID |
4 字节 | 早期版本用于归档日志,现在通常也用作表空间 ID 的一部分或保留。 |
3.4 Page Header(页头)
记录这个页的“当前宏观状态”。
| 字段 | 长度 | 作用 |
|---|---|---|
| PAGE_N_DIR_SLOTS | 2 字节 | Page Directory 里有多少个槽(Slot) |
| PAGE_HEAP_TOP | 2 字节 | 页内空闲空间的起始位置 |
| PAGE_N_HEAP | 2 字节 | 页内总记录数(含两条虚拟记录) |
| PAGE_N_RECS | 2 字节 | 页内总记录数 |
| PAGE_FREE | 2 字节 | 第一条被删除记录的偏移地址 |
| PAGE_LAST_INSERT | 2 字节 | 最后插入记录的位置 |
| PAGE_LEVEL | 2 字节 | 当前页在 B+ 树中处于第几层。 |
3.5 Infimum 和 Supremum(下界与上界)
所有用户记录通过单向链表连接。Infimum 和 Supremum 作为链表的固定头节点和尾节点:
| 记录 | 含义 | 作用 |
|---|---|---|
| Infimum | 下确界 | 页内最小的记录,比所有用户记录都小 |
| Supremum | 上确界 | 页内最大的记录,比所有用户记录都大 |
3.5.1 示例一
Infimum → 记录10 → 记录20 → 记录30 → Supremum
3.5.1 示例二

3.6 User Records
User Records,即全部的数据行,User Record即一条数据。
浙公网安备 33010602011771号