1. MySQL 的数据存放位置
当我们在 MySQL 数据库中创建一个表时,MySQL 会在数据库对应的文件夹下生成三个文件:
1.1 db.opt
文件
- 是什么:
每个数据库都有一个db.opt
文件,这个文件保存了数据库的配置信息。 - 作用:
记录数据库的字符集(character set
)和排序规则(collation
)。 - 位置:
位于数据库对应的目录中,比如data/your_database/
。 - 内容举例:
假如你的数据库字符集是utf8mb4
,db.opt
文件的内容可能是:
default-character-set=utf8mb4
default-collation=utf8mb4_general_ci
1.2 t_order.frm
文件
- 是什么:
frm
文件是表定义文件,保存了表的元数据(也就是表的结构信息)。 - 作用:
描述表的结构,例如表名、字段名、字段类型、索引等信息。 - 注意:
在 MySQL 8.0 及以后版本中,frm
文件被数据字典取代,表结构信息直接存储在系统表中。 - 举例:
如果我们创建表t_order
:
CREATE TABLE t_order (
order_id INT PRIMARY KEY,
order_date DATE
);
t_order.frm
文件会包含 order_id
是主键,order_date
是日期类型等结构信息。
1.3 t_order.ibd
文件
- 是什么:
ibd
文件是 InnoDB 存储引擎的表空间文件,用于存储表的数据和索引。 - 作用:
保存了表的实际数据(行记录)和相关索引。 - 特点:
- 每个表对应一个独立的
ibd
文件,称为独立表空间模式。 - 表空间文件包含了表的数据和所有索引。
- 默认情况下,
ibd
文件位于与数据库同名的目录中,比如:data/your_database/t_order.ibd
。
- 每个表对应一个独立的
2. 表空间文件的结构
接下来,表空间文件(如 t_order.ibd
)的存储结构是一个重点,它是由段(segment)、区(extent)、页(page) 和 行(row) 组成的。我们会按以下顺序逐步展开说明:
- 段(Segment)
- 区(Extent)
- 页(Page)
- 行(Row)
2.1 段(Segment)
是什么:
段是表空间中存储数据的基本单位。
- 每个表和索引在表空间中都有对应的段。
- 一个段可以看作是为了存储某一类数据(比如表的数据、索引、undo 日志等)而分配的逻辑存储结构。
类型:
段主要分为三种类型:
- 数据段(Data Segment): 存储表的行数据。
- 索引段(Index Segment): 存储表中索引的数据。
- 回滚段(Rollback Segment): 存储事务中的 undo 日志,用于回滚或 MVCC(多版本并发控制)。
特点:
- 一个段是由多个 区(Extent) 组成的。
- InnoDB 会动态地为段分配更多的区来扩展存储。
运作流程:
- 当一个表被创建时,InnoDB 会自动为该表分配一个初始的段。
- 如果表的数据量增大且需要更多空间,InnoDB 会自动为段分配更多的区。
2.2 区(Extent)
是什么:
区是段中的次级逻辑分区,