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. 索引页(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 性能中扮演着重要角色:
- 数据页和索引页: 直接影响查询性能,缓冲池中的这些页越多,命中率越高,性能越好
- 撤销页: 过多的撤销页可能表明有长时间运行的事务,可能影响并发性能
- 压缩页: 减少 I/O 但增加 CPU 开销,需权衡
- 溢出页: 访问大字段时可能导致额外 I/O,影响性能
如何查看页信息
可以使用 InnoDB 监控工具和性能模式查看页的使用情况:
1 | -- 查看InnoDB buffer pool中的页统计信息 |
总结
MySQL 的页是其存储系统的核心组件,不同类型的页协同工作,确保数据的完整性、一致性和高效访问。理解这些页类型有助于优化数据库设计和性能调优。对于大型数据库系统,优化页的使用和配置(如缓冲池大小、页压缩等)可以显著提高性能。