深入浅出 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_logfile0ib_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:存储外键约束