mysql - 页

1 页的基本概念

  • 在一个数据库中创建一张表时,此时就会生成一个.ibd文件,一张表对应一个.ibd文件,而页就是.ibd文件中最重要的结构体。

  • 在 InnoDB 中,默认页大小是 16 KB(可以通过innodb_page_size参数修改为4KB、8KB、32KB 或 64KB)。

  • 在MySQL中,页是内存与磁盘交互的最小单元。

    • InnoDB 与磁盘交互,每次读取的最小单位是一页(16KB)。查一行,也会把那查一行所在的 16KB 全部加载进来。
      InnoDB 向磁盘写入数据,每次写入的最小单位也是一页。内存中修改了页里的一行,刷新到磁盘时,也是重写整个 16KB。

2 页的内部结构

image

一个典型的 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 示例二

image

3.6 User Records

User Records,即全部的数据行,User Record即一条数据。

posted @ 2026-04-25 12:20  dvdhellohaha  阅读(22)  评论(0)    收藏  举报