深入浅出 MySQL InnoDB磁盘结构全解析:表空间、日志系统与数据字典详解
InnoDB存储结构
InnoDB 存储引擎的磁盘结构是其核心组成部分。
1. Tablespaces(表空间)
表空间是 InnoDB 存储数据的物理文件,可以分为:
- 系统表空间:存储数据字典、双写缓冲区等元数据信息,默认文件名为
ibdata1 - 独立表空间:每个表可以有独立的表空间文件(
.ibd文件) - 通用表空间:多个表可以共享同一个表空间
- 临时表空间:存储临时表和临时数据
2. InnoDB Data Dictionary(数据字典)
数据字典包含以下元数据:
- 表结构信息(列名、类型、索引等)
- 表空间信息
- 外键约束
3. Doublewrite Buffer(双写缓冲区)
- 位于系统表空间中的特殊区域(默认2MB)
- 作用:防止页写入不完整(partial page write)
- 工作流程:先将脏页写入双写缓冲区,再将脏页写入实际数据文件位置
4. Redo Log(重做日志)
- 物理日志,记录对页的物理修改
- 组成:默认2个文件
ib_logfile0和ib_logfile1 - 作用:实现事务的持久性
5. Undo Log(回滚日志)
- 逻辑日志,记录事务修改前的数据状态
- 作用:事务回滚时恢复数据,实现 MVCC
表空间详解
系统表空间 The System Tablespace
包含 InnoDB 数据字典,Doublewrite Buffer、Change Buffer、Undo Log的存储区域。
独立表空间 File-Per-Table Tablespaces
默认开启,每个表创建于自己的数据文件中。
通用表空间 General Tablespaces
通过 create tablespace 语法创建的共享表空间。
临时表空间 Temporary Tablespaces
- Session Temporary Tablespaces:每个会话的临时表
- Global Temporary Tablespaces:全局共享的临时表
数据字典
InnoDB数据字典是MySQL存储引擎的核心组件,由一系列内部系统表组成:
- SYS_TABLES:存储表的基本信息
- SYS_COLUMNS:记录列定义
- SYS_INDEXES:保存索引信息
- SYS_FIELDS:记录索引字段
- SYS_FOREIGN:存储外键约束