InnoDB 数据文件

1. 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
    行:包含了记录的字段值,事务IDTrx id)、滚动指针(Roll pointer)、字段指针(Field pointers)等信息

说明:Page 是文件最基本的单位,无论何种类型的 page,都是由page headerpage trailerpage body 组成。如下图所示

2. InnoDB 文件存储格式

  • 通过 SHOW TABLE STATUS 命令
SHOW TABLE STATUS


一般情况下,如果 row_formatREDUNDANTCOMPACT,文件格式为 Antelope;如果 row_formatDYNAMICCOMPRESSED,文件格式为 Barracuda

  • 通过 information_schema 查看指定表的文件格式
select * from information_schema.innodb_sys_tables;

2.1 File文件格式(File-Format)

在早期的 InnoDB 版本中,文件格式只有一种,随着 InnoDB引擎的发展,出现了新文件格式,用于支持新的功能。目前 InnoDB只支持两种文件格式:AntelopeBarracuda

  • Antelope: 先前未命名的,最原始的 InnoDB 文件格式,它支持两种行格式:COMPACTREDUNDANTMySQL 5.6 及其以前版本默认格式为 Antelope
  • Barracuda: 新的文件格式。它支持 InnoDB 的所有行格式,包括新的行格式:COMPRESSEDDYNAMIC

通过 innodb_file_format 配置参数可以设置 InnoDB 文件格式,之前默认值为 Antelope5.7 版本开始改为 Barracuda

2.2 Row行格式(Row_format)

表的行格式决定了它的行是如何物理存储的,这反过来又会影响查询和DML 操作的性能。如果在单个 page 页中容纳更多行,查询和索引查找可以更快地工作,缓冲池中所需的内存更少,写入更新时所需的 I/O 更少。

InnoDB 存储引擎支持四种行格式:REDUNDANTCOMPACTDYNAMICCOMPRESSED


DYNAMICCOMPRESSED 新格式引入的功能有:数据压缩、增强型长列数据的页外存储和大索引前缀。

每个表的数据分成若干页来存储,每个页中采用 B 树结构存储;

如果某些字段信息过长,无法存储在B树节点中,这时候会被单独分配空间,此时被称为溢出页,该字段被称为页外列。

  • REDUNDANT 行格式
    使用 REDUNDANT行格式,表会将变长列值的前768字节存储在B树节点的索引记录中,其余的存储在溢出页上。对于大于等于786字节的固定长度字段,InnoDB会转换为变长字段,以便能够在页外存储。

  • COMPACT 行格式
    REDUNDANT 行格式相比,COMPACT 行格式减少了约 20% 的行存储空间,但代价是增加了某些操作的 CPU 使用量。如果系统负载是受缓存命中率和磁盘速度限制,那么 COMPACT格式可能更快。如果系统负载受到 CPU 速度的限制,那么 COMPACT 格式可能会慢一些。

  • DYNAMIC行格式
    使用 DYNAMIC 行格式,InnoDB 会将表中可变长度的列值完全存储在页外,而索引记录只包含指向溢出页的 20 字节指针。大于或等于 768字节的固定长度字段编码为可变长度字段。DYNAMIC 行格式支持大索引前缀,最多可以为 3072 字节,可通过innodb_large_prefix 参数控制。

  • COMPRESSED 行格式
    COMPRESSED 行格式提供与 DYNAMIC 行格式相同的存储特性和功能,但增加了对表和索引数据压缩的支持。

在创建表和索引时,文件格式都被用于每个 InnoDB 表数据文件(其名称与 *.ibd 匹配)。修改文件格式的方法是重新创建表及其索引,最简单方法是对要修改的每个表使用以下命令:

ALTER TABLE 表名 ROW_FORMAT = 格式类型;
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容