Skip to content

MySQL有什么页

概述

  • 定义
  • MySQL(以 InnoDB 存储引擎为主)使用 页(Page) 作为磁盘和内存之间的基本存储单位,管理数据和索引。
  • 页是 InnoDB 存储引擎中数据存储和操作的最小单位,默认大小为 16KB(可通过 innodb_page_size 配置为 4KB、8KB、32KB 或 64KB)。
  • 不同类型的页存储不同的数据或元数据,用于支持表数据、索引、事务、日志等功能。
  • 核心点
  • MySQL InnoDB 的页类型包括 数据页索引页Undo 页系统页事务数据页溢出页 等。
  • 每种页在存储结构和功能上各有用途,共同支持数据库的高效运行。

1. MySQL 数据库中的页类型

以下是 MySQL InnoDB 存储引擎中常见页类型及其功能和存储内容:

(1) 数据页(Data Page / Table Data Page)

  • 定义
  • 数据页用于存储表中的实际行数据,是 InnoDB 表空间中最常见的页类型。
  • 存储内容
  • 表行数据(用户记录),按主键顺序组织(聚集索引)。
  • 页头(Page Header):记录页状态、记录数、空闲空间等。
  • 行记录(Row Records):实际的表数据。
  • 页目录(Page Directory):记录行偏移量,加速查找。
  • 空闲空间(Free Space):用于插入新记录。
  • 页尾(Page Trailer):校验和,防止数据损坏。
  • 用途
  • 存储和查询表数据(如 SELECT, INSERT, UPDATE)。
  • 主键索引(聚集索引)的叶子节点即为数据页。
  • 特点
  • 数据按主键排序,同一页内记录连续存储。
  • 支持变长字段(如 VARCHAR),可能涉及溢出页。
  • 示例
  • users(id, name, email) 的数据页存储: Page Header: [page_no, record_count, free_space, ...] Row Records: [id=1, name="Alice", email="alice@example.com"], [id=2, name="Bob", ...] Page Directory: [offset_1, offset_2, ...] Page Trailer: [checksum]

(2) 索引页(Index Page)

  • 定义
  • 索引页用于存储 B+ 树索引的节点,包括主键索引和辅助索引(二级索引)的非叶子节点和叶子节点。
  • 存储内容
  • 叶子节点(辅助索引):
    • 索引列值 + 主键值(如 [name="Alice", id=1])。
    • 页头、页目录、空闲空间、页尾。
  • 非叶子节点
    • 索引列值 + 子节点指针(如 [name="Alice", page_no=100])。
  • 主键索引叶子节点
    • 等同于数据页,存储整行数据。
  • 用途
  • 加速查询(如 WHERE, JOIN, ORDER BY)。
  • 支持范围查询、精确查找。
  • 特点
  • B+ 树结构,叶子节点按索引键排序。
  • 辅助索引需回表获取非索引列。
  • 示例
  • 辅助索引 idx_name 的叶子节点: [name="Alice", id=1], [name="Bob", id=2], ...

(3) Undo 页(Undo Log Page)

  • 定义
  • Undo 页存储 Undo 日志,用于事务回滚和多版本并发控制(MVCC)。
  • 存储内容
  • Undo 日志记录:
    • 事务修改前的旧数据(如 UPDATE 前的值)。
    • 事务 ID、回滚指针等元数据。
  • 页头、页尾等结构。
  • 用途
  • 事务回滚:恢复数据到修改前状态。
  • MVCC:提供一致性读(快照读),支持 REPEATABLE READ 隔离级别。
  • 特点
  • 存储在回滚段(Rollback Segment)中,位于系统表空间或独立 Undo 表空间(MySQL 8.0+)。
  • Undo 日志分为 Insert Undo(插入操作)和 Update Undo(更新/删除操作)。
  • 示例
  • 更新 UPDATE users SET name='Alice' WHERE id=1
    • Undo 页记录旧值:[id=1, name="OldName"]

(4) 系统页(System Page)

  • 定义
  • 系统页存储表空间的元数据和管理信息,位于表空间开头。
  • 存储内容
  • File Header:表空间信息(如页数、校验和)。
  • File Trailer:校验和。
  • Extent Descriptor:区(Extent,64 页)分配信息。
  • Space Header:表空间属性(如表空间 ID、页分配状态)。
  • 用途
  • 管理表空间结构,跟踪页分配和状态。
  • 初始化表空间(如 ibdata1 或独立表空间)。
  • 特点
  • 位于表空间固定位置(如页 0)。
  • 每个表空间(系统表空间或独立表空间)都有系统页。

(5) 事务数据页(Transaction System Page)

  • 定义
  • 事务数据页存储事务系统的元数据,管理活跃事务和锁信息。
  • 存储内容
  • 事务状态:活跃事务列表、事务 ID。
  • 锁信息:行锁、表锁的状态。
  • 回滚段信息:指向 Undo 日志的指针。
  • 用途
  • 管理事务的并发控制和一致性。
  • 支持事务隔离级别(如 READ COMMITTED, REPEATABLE READ)。
  • 特点
  • 位于系统表空间,通常占用固定页(如页 5)。
  • 与 Undo 页协作实现 MVCC 和事务回滚。

(6) 溢出页(Overflow Page / Blob Page)

  • 定义
  • 溢出页存储大对象数据(如 TEXT, BLOB, VARCHAR 超长值),当数据无法放入数据页时使用。
  • 存储内容
  • 大对象数据分片(如 TEXT 字段的完整内容)。
  • 指针:数据页中的行记录指向溢出页。
  • 用途
  • 存储超过数据页限制的变长字段(默认 16KB)。
  • 支持大文本或二进制数据。
  • 特点
  • 数据页仅存储前缀(20 字节或 768 字节,视配置)和溢出页指针。
  • 溢出页按需分配,可能跨多个页。
  • 示例
  • articles(id, content TEXT)
    • content 超长,数据页存 [id=1, content_prefix="abc...", overflow_page=100]
    • 溢出页 100 存完整 content

(7) 区管理页(Extent Descriptor Page)

  • 定义
  • 区管理页存储区(Extent,64 个连续页,1MB)的分配和状态信息。
  • 存储内容
  • 区元数据:区内页的分配状态(空闲、部分使用、满)。
  • 指向具体页的指针。
  • 用途
  • 管理表空间的物理存储分配。
  • 优化页分配效率。
  • 特点
  • 区是 InnoDB 分配磁盘空间的基本单位,区管理页跟踪其状态。
  • 位于表空间的固定位置。

(8) 段管理页(Segment Descriptor Page)

  • 定义
  • 段管理页存储段(Segment)的元数据,段是表或索引的逻辑存储单元。
  • 存储内容
  • 段元数据:指向区的指针、段内页分配状态。
  • 表或索引的标识信息。
  • 用途
  • 管理表或索引的存储结构(每个表/索引有多个段,如数据段、索引段)。
  • 支持动态扩展和收缩。
  • 特点
  • 段包含多个区,段管理页位于表空间头部。

(9) 其他页类型

  • 临时表空间页(Temporary Tablespace Page)
  • 存储临时表数据和中间结果(如 CREATE TEMPORARY TABLE)。
  • 特点:仅在内存/磁盘临时表空间,生命周期与会话相关。
  • Redo Log 页
  • 虽然不直接是表空间中的页,但 Redo 日志(ib_logfile)以页为单位存储事务日志。
  • 用途:崩溃恢复,保证事务持久性。
  • Doublewrite Buffer 页
  • 存储数据页的副本,防止写入中断导致数据损坏。
  • 特点:位于系统表空间,写数据前先写 Doublewrite Buffer。

2. 页的存储结构

所有 InnoDB 页遵循统一的结构(以 16KB 为例): - File Header (38 字节):页编号、校验和、前后页指针。 - Page Header (56 字节):页内记录数、空闲空间、页目录槽数。 - User Records:实际数据(如行记录、索引键)。 - Free Space:未分配空间,用于新记录。 - Page Directory:记录偏移量,加速查找。 - File Trailer (8 字节):校验和,确保数据完整性。

页结构图

+-------------------+
| File Header       | 38 bytes
+-------------------+
| Page Header       | 56 bytes
+-------------------+
| Free Space        | Variable
+-------------------+
| User Records      | Variable
+-------------------+
| Page Directory    | Variable
+-------------------+
| File Trailer      | 8 bytes
+-------------------+
Total: 16KB

3. 页类型与功能总结

页类型 存储内容 主要用途
数据页 表行数据(整行) 存储表数据,支持聚集索引查询
索引页 索引键 + 主键(辅助索引)或整行(主键索引) 加速索引查询,支持 B+ 树
Undo 页 Undo 日志(旧数据、事务元数据) 事务回滚、MVCC 一致性读
系统页 表空间元数据(页分配、校验和) 管理表空间结构
事务数据页 事务状态、锁信息 事务管理和并发控制
溢出页 大对象数据(TEXT、BLOB) 存储超大数据
区管理页 区分配状态 管理磁盘空间分配
段管理页 段元数据(表/索引) 管理表/索引的逻辑存储
临时表空间页 临时表数据 临时表和中间结果
Doublewrite Buffer 数据页副本 防止写入中断

4. 注意事项

  • 页大小
  • 默认 16KB,可通过 innodb_page_size 设置(4KB、8KB、32KB、64KB)。
  • 小页适合随机读写,大页适合顺序读写(如 OLAP)。
  • 修改需重建数据库实例。
  • 存储引擎差异
  • InnoDB:支持所有上述页类型,B+ 树为主,事务和 MVCC 依赖 Undo 页。
  • MyISAM:仅数据页和索引页,非聚集索引,存储行指针,无 Undo/事务页。
  • 性能影响
  • 数据页和索引页直接影响查询性能,需优化索引设计。
  • Undo 页过多可能导致回滚段膨胀,需监控(innodb_undo_tablespaces)。
  • 溢出页增加 I/O,尽量避免超大 TEXT/BLOB
  • 表空间
  • 系统表空间(ibdata1)存储系统页、Undo 页等。
  • 独立表空间(*.ibd)存储数据页、索引页等(innodb_file_per_table=ON)。
  • 监控与优化
  • 查看页分配: sql SELECT * FROM information_schema.INNODB_SYS_TABLESPACES;
  • 分析页使用: sql SHOW ENGINE INNODB STATUS;
  • 优化碎片: sql OPTIMIZE TABLE table_name;

5. 面试角度

  • 问“MySQL 数据库有哪些页”
  • 提数据页(表数据)、索引页(B+ 树)、Undo 页(事务回滚)、系统页(表空间元数据)、事务数据页(事务管理)、溢出页(大对象)、区/段管理页。
  • 问“数据页和索引页区别”
  • 提数据页存整行(主键索引叶子),索引页存键值 + 主键(辅助索引),主键索引叶子即数据页。
  • 问“Undo 页作用”
  • 提事务回滚和 MVCC,提供旧版本数据,支持一致性读,存储在回滚段。
  • 问“溢出页何时使用”
  • 提存储超长 TEXT/BLOB,数据页存指针,溢出页存完整数据。
  • 问“InnoDB vs MyISAM 页差异”
  • 提 InnoDB 有 Undo、事务页,支持 MVCC;MyISAM 仅数据页和索引页,无事务支持。
  • 问“如何优化页使用”
  • 提合理页大小(16KB 默认)、独立表空间、优化索引、清理 Undo 日志、监控碎片。

6. 总结

  • MySQL 页类型
  • 数据页:表行数据(聚集索引)。
  • 索引页:索引键 + 主键(辅助索引)或整行(主键索引)。
  • Undo 页:Undo 日志,事务回滚和 MVCC。
  • 系统页:表空间元数据。
  • 事务数据页:事务和锁管理。
  • 溢出页:大对象数据。
  • 区/段管理页:磁盘和逻辑存储管理。
  • 临时表空间页Doublewrite Buffer:临时数据和写入保护。
  • 特点
  • 默认 16KB,B+ 树为主(除 R 树、倒排索引)。
  • InnoDB 支持事务和 MVCC,MyISAM 仅数据/索引页。
  • 面试建议
  • 提页类型、存储内容(数据页整行、索引页键值)、用途(MVCC、查询加速)、InnoDB vs MyISAM,举例(B+ 树叶子节点),清晰展示理解。