1. 逻辑层次结构总览
InnoDB采用经典的层次化存储设计,从上到下可分为:
- 表空间(Tablespace)
- 段(Segment)
- 区(Extent)
- 页(Page)
- 行(Row)
每个层级都承担着特定的职责,共同构建起高效的数据存取体系。为了方便理解,可以将其类比为图书馆管理系统:
- 表空间 → 整个图书馆
- 段 → 按主题划分的馆区(科技区、文学区等)
- 区 → 每个书架组的存储单元(可以理解为科技区中的一排书架)
- 页 → 单个书架的存储单元
- 行 → 每本具体的书籍
2. 存储单元逐层解析
2.1 表空间(Tablespace):逻辑与物理的桥梁
2.1.1 什么是表空间?
表空间是InnoDB存储引擎中最高层次的逻辑存储结构。它是数据库物理文件的逻辑抽象,用于存储表、索引等数据。表空间可以理解为一个“容器”,里面存放了数据库的所有数据。
2.1.2 表空间的分类
InnoDB的表空间主要分为以下几类:
- 系统表空间(System Tablespace):
- 存储InnoDB的系统元数据,如数据字典、事务系统信息等。
- 默认情况下,系统表空间还包含所有用户表的数据和索引(除非启用了独立表空间模式)。
- 独立表空间(File-Per-Table Tablespace):
- 当开启innodb_file_per_table配置项后,每个表有自己独立的表空间文件(
<font style="color:rgb(64, 64, 64);">.ibd</font>
文件),存储表的数据和索引。 - 这种模式更灵活,便于管理和优化。
- 当开启innodb_file_per_table配置项后,每个表有自己独立的表空间文件(
- 通用表空间(General Tablespace):
- 多个表可以共享一个表空间文件。
- Undo表空间(Undo Tablespace):
- 存储事务回滚所需的数据。
- 临时表空间(Temporary Tablespace):
- 存储临时表和排序操作的数据。
现代MySQL默认启用独立表空间模式(innodb_file_per_table=ON),每个表有独立的.ibd文件,其优势包括:
- 空间回收更容易(DROP TABLE直接删除文件)
- 减少系统表空间膨胀
- 更灵活的空间管理
2.1.3 表空间的作用
- 管理数据库的物理存储文件。
- 提供数据的逻辑隔离,便于管理和优化。
2.1.4 文件结构
独立表空间文件包含:
- 文件头(FSP Header):存储表空间元数据
- 段管理信息(INODE Entry)
- 数据段(叶子节点段):即 B + 树的叶子节点段,用于存储实际的数据记录。InnoDB 是索引组织表,数据段存储了表中的数据以及行的额外信息,如变长字段的长度列表、NULL 值标志位、记录头信息,还有事务 ID 列与回滚指针列等隐藏列。
- 索引段(非叶子节点段):是 B + 树的非叶子节点段,主要存储索引数据,用于加快数据的查找和检索。索引段包含了索引键值以及指向数据页或其他索引页的指针,帮助数据库快速定位到需要查询的数据。
- 回滚段:用于存储事务的回滚信息。在事务执行过程中,对数据的修改操作会先记录在回滚段中,如果事务需要回滚,就可以根据回滚段中的信息将数据恢复到修改前的状态。回滚段还可以用于实现 MVCC(多版本并发控制),提供数据的一致性视图。