本文共 1705 字,大约阅读时间需要 5 分钟。
InnoDB 存储结构深入解析
InnoDB 是 MySQL 中最常用的关系数据库引擎,其核心存储结构设计非常高效。以下将从基础到高级功能,全面解析 InnoDB 的存储结构。
1. InnoDB 磁盘结构
InnoDB 的磁盘主要包含以下几个关键组件:
- 表空间 (Tablespaces)
- 包括系统表空间、独立表空间、撤销表空间、临时表空间等多种类型。
- InnoDB 数据字典 (Data Dictionary)
- 双写缓冲区 (Double Write Buffer)
- 用于解决部分页失效问题,确保数据写入磁盘的可靠性。
- 重做日志 (Redo Log)
- 撤销日志 (Undo Log)
2. 表空间 (Tablespaces)
2.1 系统表空间 (System Tablespace)
- 包含 InnoDB 数据字典、双写缓冲区、撤销日志等核心组件。
- 默认路径为
ibdata1
,大小可通过 innodb_data_file_path
参数配置。
2.2 独立表空间 (File-Per-Table Tablespaces)
- 每个表拥有独立的数据文件,文件名为
.ibd
,默认存储于数据库目录。 - 使用
innodb_file_per_table
参数启用。
2.3 常规表空间 (Regular Tablespaces)
2.4 撤销表空间 (Undo Tablespaces)
- 存储撤销日志,用于事务回滚。
- 默认存储于系统表空间中,8.0 版本后可配置独立存储。
2.5 临时表空间 (Temporary Tablespaces)
- 存储临时表和磁盘内部临时表。
- 8.0 版本后默认存储于
ibtmp1
文件中。
3. 数据字典 (Data Dictionary)
3.1 MySQL 8.0 之后
- 数据字典信息存储在 InnoDB 系统表空间中,不再依赖
.frm
文件。 - 提供原子 DDL 操作,提升数据一致性。
4. 双写缓冲区 (Double Write Buffer)
4.1 什么是双写缓冲区?
- InnoDB 在写入数据时,先将脏页存入双写缓冲区,再写入磁盘。
- 确保数据写入可靠,防止磁盘故障导致数据丢失。
4.2 数据双写流程
写入缓冲池中的脏页。 复制脏页至双写缓冲区。 按顺序写入磁盘。 写入各表独立表空间。 4.3 为什么写两次?
- 第一次顺序写入共享表空间。
- 第二次随机写入独立表空间,确保数据完整性。
5. 重做日志 (Redo Log)
5.1 WAL 机制
- 写前日志(Write-Ahead Logging),确保数据持久性。
5.2 重做日志格式
- 物理日志:记录具体数据页修改。
- 逻辑日志:记录事务操作的逻辑。
5.3 重做日志写入机制
- 将日志缓冲区内容写入磁盘,确保数据持久性。
- 支持多个文件组,循环使用。
6. 撤销日志 (Undo Log)
6.1 作用
- 提供事务回滚和多版本控制(MVCC)。
- 记录事务开始前的数据状态。
6.2 工作原理
- 事务提交前记录数据变化。
- 事务回滚时利用撤销日志恢复数据。
7. 二进制日志 (Binlog)
7.1 基本概念
7.2 模式
- ROW 模式:记录每行数据修改。
- STATEMENT 模式:记录 SQL 语句。
- 混合模式:结合 ROW 和 STATEMENT 模式。
7.3 写入机制
- 写入缓冲区 → 系统缓存 → 磁盘。
- 支持异步和同步刷盘。
8. 新版本特性
8.1 MySQL 5.7
- 支持独立撤销表空间和临时表空间。
- 动态调整 Buffer Pool 大小。
8.2 MySQL 8.x
- 数据字典和撤销日志完全分离。
- 临时表空间支持多文件和索引。
- Double Write Buffer 从共享表空间中分离。
InnoDB 的存储结构设计充分体现了高可用性和高扩展性,适用于大规模数据存储和高并发场景。
转载地址:http://uydfk.baihongyu.com/