InnoDB数据文件存储结构
分为一个ibd数据文件–>Segment(段)–>Extent(区)–>Page(页)–>Row(行)
- Tablesapce
表空间,用于存储多个ibd数据文件,用于存储表的记录和索引。一个文件包含多个段。
- Segment
段,用于管理多个Extent,分为数据段(Leaf node segment)、索引段(Non-leaf node
segment)、回滚段(Rollback segment)。一个表至少会有两个segment,一个管理数
据,一个管理索引。每多创建一个索引,会多两个segment。
- Extent
区,一个区固定包含64个连续的页,大小为1M。当表空间不足,需要分配新的页资源,不会
一页一页分,直接分配一个区。
- Page
页,用于存储多个Row行记录,大小为16K。包含很多种页类型,比如数据页,undo页,系
统页,事务数据页,大的BLOB对象页。
- Row
行,包含了记录的字段值,事务ID(Trx id)、滚动指针(Roll pointer)、字段指针(Field
pointers)等信息。
文件格式和行格式
文件格式决定了表的数据如何在磁盘上存储,MySQL 支持 Antelope
和 Barracuda
两种文件格式。
- Antelope /ˈæntɪləʊp/: 先前未命名的,最原始的InnoDB文件格式,它支持两种行格式:COMPACT和
REDUNDANT,MySQL 5.6及其以前版本默认格式为Antelope。
- Barracuda/ˌbærəˈkuːdə/: 新的文件格式。它支持InnoDB的所有行格式,包括新的行格式:COMPRESSED
和 DYNAMIC。
行格式决定了单个表的存储结构。常见的行格式包括 Compact
、Redundant
、Dynamic
和 Compressed
。
- REDUNDANT 行格式
使用REDUNDANT行格式,表会将变长列值的前768字节存储在B树节点的索引记录中,其余
的存储在溢出页上。对于大于等于786字节的固定长度字段InnoDB会转换为变长字段,以便
能够在页外存储。
适用场景:为了兼容非常旧版本的 MySQL(很少使用)
- COMPACT 行格式
与REDUNDANT行格式相比,COMPACT行格式减少了约20%的行存储空间,但代价是增加了
CPU使用量。如果系统负载是受缓存命中率和磁盘速度限制,那么COMPACT格式
可能更快。如果系统负载受到CPU速度的限制,那么COMPACT格式可能会慢一些。
适用场景:常见的表数据存储需求,适合小型字段的数据
- DYNAMIC 行格式
使用DYNAMIC行格式,InnoDB会将表中长可变长度的列值完全存储在页外,而索引记录只
包含指向溢出页的20字节指针。大于或等于768字节的固定长度字段编码为可变长度字段。
DYNAMIC行格式支持大索引前缀,最多可以为3072字节,可通过innodb_large_prefifix参数
控制。
适用场景:表中包含大字段(TEXT 或 BLOB)的数据存储需求。
- COMPRESSED 行格式
COMPRESSED行格式提供与DYNAMIC行格式相同的存储特性和功能,但增加了对表和索引
数据压缩的支持。
适用场景:需要最大化节省存储空间的场景,特别是存储只读数据的表。