Skip to content

MySQL有什么页

1. 页(Page)是什么:InnoDB 的基本 I/O 单位

在 InnoDB 里,“页(Page)”是磁盘与内存之间读写的最小单位。无论是读取索引、读取数据行还是刷脏页,最终都以页为粒度进行。

常见默认页大小是 16 KB(具体可配置,但不是越大越好,需结合工作负载评估)。

2. 常见页类型

2.1 索引页 / 数据页(B+ 树页)

  • B+ 树的非叶子节点与叶子节点都存放在索引页中。
  • InnoDB 的聚簇索引叶子页存放整行数据;二级索引叶子页存放二级索引键 + 主键值。

2.2 Undo 页(Undo Log Pages)

Undo 用于:

  • 事务回滚(把修改恢复到旧版本)。
  • MVCC(构造历史版本供一致性读)。

Undo 本身也存放在页里,属于系统内部管理的日志页。

2.3 系统页 / 元数据页

用于维护表空间、段、区、页的分配与管理信息,以及一些内部结构(属于实现细节层面,面试可概括为“表空间与内部元数据管理页”)。

2.4 Change Buffer(Insert Buffer)相关页

Change Buffer 用于优化非唯一二级索引的写入:把对二级索引的随机写先缓存在 Change Buffer 中,后续在合适时机合并到真实索引页,从而减少随机 I/O。

3. 索引页的内部结构

索引页不是“简单数组”,它内部大致包含:

  • 页头(Page Header):页号、校验、记录数、链表指针等。
  • 两条边界记录:infimum / supremum(用于组织页内记录链表)。
  • 用户记录区域:按主键/索引键有序组织。
  • 页目录(Page Directory):加速页内二分定位。

理解这套结构,才能解释“为什么主键顺序插入更快”“为什么会页分裂”。

4. 页分裂、页合并与碎片

4.1 页分裂(Split)

当一个页插入新记录导致空间不足时,可能发生页分裂:把部分记录移动到新页,并调整 B+ 树结构。这会带来:

  • 额外 I/O 与 CPU 开销。
  • 产生更多碎片(页利用率下降)。

主键随机写(例如 UUID 无序)更容易触发分裂。

4.2 页合并(Merge)

删除大量记录后,页利用率过低时可能发生合并,把记录挪到相邻页并回收空页,但合并并不是每次删除都会发生(依赖策略与阈值)。

5. Buffer Pool:为什么页是性能核心

Buffer Pool 以“页”为单位缓存热点数据:

  • 命中:直接在内存读写。
  • 不命中:读取磁盘页进入 Buffer Pool,再访问。

写操作会产生脏页(dirty page),后续再通过刷盘机制落盘。因此页命中率、脏页比例与刷盘策略,往往决定了线上读写性能与抖动。