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"]
。
- Undo 页记录旧值:
(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+ 树叶子节点),清晰展示理解。