MySQL 页类型详解

MySQL 页的概念

在 InnoDB 存储引擎中,页(Page)是数据存储的基本单位,默认大小为 16KB。MySQL 以页为单位进行磁盘与内存之间的数据交换,这种设计可以显著减少 I/O 操作次数,提高数据库性能。

InnoDB 页的通用结构

每个 InnoDB 页都包含以下几个部分:

  • 文件头(File Header): 记录页的控制信息,占 38 字节
  • 页头(Page Header): 记录页的状态信息,占 56 字节
  • 主体数据区(Body): 存储实际数据
  • 文件尾(File Trailer): 用于页面完整性检查,占 8 字节

MySQL 中的主要页类型

1. 数据页(B-tree Node)

数据页是最常见的页类型,用于存储表中的实际数据记录。

特点

  • 使用 B+树结构组织
  • 包含多条记录
  • 记录按主键顺序排列
  • 叶子节点包含完整的用户数据
  • 非叶子节点只包含索引键值和指向子页的指针

数据页结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
+------------------+
| File Header |
+------------------+
| Page Header |
+------------------+
| Infimum Record |
+------------------+
| User Records |
+------------------+
| Free Space |
+------------------+
| Supremum Record |
+------------------+
| Page Directory |
+------------------+
| File Trailer |
+------------------+

2. 索引页(Index Page)

索引页专门用于存储索引信息,加速数据检索。

特点

  • 也使用 B+树结构
  • 非聚集索引的叶子节点存储主键值
  • 非叶子节点存储索引键值和指向子页的指针

3. 撤销页(Undo Log Page)

撤销页用于存储撤销日志记录,支持事务回滚和 MVCC(多版本并发控制)。

特点

  • 记录数据修改前的状态
  • 按事务分组组织
  • 支持事务的原子性和隔离性

4. 系统页(System Page)

系统页用于存储 InnoDB 内部系统信息。

主要系统页

  • 数据字典页: 存储表定义等元数据
  • 双写缓冲页: 用于防止部分写失效
  • 插入缓冲位图页: 记录哪些索引页包含插入缓冲记录
  • 事务系统页: 存储活跃事务信息

5. 溢出页(Overflow Page)

当记录太长无法完全存储在数据页中时,使用溢出页存储额外数据。

特点

  • 用于存储大字段(如 TEXT, BLOB)
  • 通过指针从主数据页链接
  • 可能有多个连续的溢出页形成链表

6. 压缩页(Compressed Page)

针对表启用压缩特性时使用的特殊页格式。

特点

  • 节省磁盘空间
  • 支持 1KB, 2KB, 4KB, 8KB 等多种压缩页大小
  • 包含额外的解压缩信息

7. 临时页(Temporary Page)

用于临时表或排序等操作的页。

特点

  • 存储在临时表空间
  • 仅在会话期间有效
  • 不写入 redo 日志

8. 碎片页(Fragment Page)

用于管理表空间中空闲空间的页。

特点

  • 记录可用于分配的空闲空间
  • 避免产生碎片
  • 提高空间利用率

页类型对性能的影响

不同类型的页在 MySQL 性能中扮演着重要角色:

  1. 数据页和索引页: 直接影响查询性能,缓冲池中的这些页越多,命中率越高,性能越好
  2. 撤销页: 过多的撤销页可能表明有长时间运行的事务,可能影响并发性能
  3. 压缩页: 减少 I/O 但增加 CPU 开销,需权衡
  4. 溢出页: 访问大字段时可能导致额外 I/O,影响性能

如何查看页信息

可以使用 InnoDB 监控工具和性能模式查看页的使用情况:

1
2
3
4
5
6
7
8
9
10
-- 查看InnoDB buffer pool中的页统计信息
SHOW ENGINE INNODB STATUS;

-- 查看表的页信息(MySQL 8.0+)
SELECT * FROM information_schema.INNODB_TABLES
WHERE NAME = 'database_name/table_name';

-- 查看索引的页信息
SELECT * FROM information_schema.INNODB_INDEXES
WHERE TABLE_ID = xxx;

总结

MySQL 的页是其存储系统的核心组件,不同类型的页协同工作,确保数据的完整性、一致性和高效访问。理解这些页类型有助于优化数据库设计和性能调优。对于大型数据库系统,优化页的使用和配置(如缓冲池大小、页压缩等)可以显著提高性能。