万隆的笔记 万隆的笔记
博文索引
笔试面试
  • 在线学站

    • 菜鸟教程 (opens new window)
    • 入门教程 (opens new window)
    • Coursera (opens new window)
  • 在线文档

    • w3school (opens new window)
    • Bootstrap (opens new window)
    • Vue (opens new window)
    • 阿里开发者藏经阁 (opens new window)
  • 在线工具

    • tool 工具集 (opens new window)
    • bejson 工具集 (opens new window)
    • 文档转换 (opens new window)
  • 更多在线资源
  • Changlog
  • Aboutme
GitHub (opens new window)
博文索引
笔试面试
  • 在线学站

    • 菜鸟教程 (opens new window)
    • 入门教程 (opens new window)
    • Coursera (opens new window)
  • 在线文档

    • w3school (opens new window)
    • Bootstrap (opens new window)
    • Vue (opens new window)
    • 阿里开发者藏经阁 (opens new window)
  • 在线工具

    • tool 工具集 (opens new window)
    • bejson 工具集 (opens new window)
    • 文档转换 (opens new window)
  • 更多在线资源
  • Changlog
  • Aboutme
GitHub (opens new window)
  • MySQL

  • 架构原理

    • MySQL体系架构
    • MySQL-SQL运行机制
    • InnoDB架构
    • InnoDB线程模型
    • InnoDB数据文件
      • InnoDB文件存储结构
      • InnoDB文件存储格式
      • File文件格式(File-Format)
      • Row行格式(Row_format)
    • Undo Log、Redo Log 和 Binlog
    • InnoDB和MyISAM对比
  • 索引与优化

  • 事务和锁

  • 集群架构

  • MySQL
  • 架构原理
2022-03-20
目录

InnoDB数据文件

# InnoDB数据文件

# InnoDB文件存储结构

innodb_datafile_1

InnoDB数据文件存储结构:分为多个ibd数据文件 --> 一个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)等信息。

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

innodb_datafile_2

# InnoDB文件存储格式

  • 通过 SHOW TABLE STATUS 命令:

    innodb_datafile_3

    一般情况下,如果row_format为REDUNDANT、COMPACT,文件格式为Antelope;如果row_format为DYNAMIC和COMPRESSED,文件格式为Barracuda。

  • 通过information_schema查看指定表的文件格式:

    innodb_datafile_4

# File文件格式(File-Format)

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

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

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

# Row行格式(Row_format)

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

InnoDB存储引擎支持四种行格式:REDUNDANT、COMPACT、DYNAMIC和COMPRESSED。

innodb_datafile_5

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

  • 每个表的数据分成若干页来存储,每个页中采用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=格式类型;
上次更新: 5/30/2023, 11:09:19 PM
Undo Log、Redo Log 和 Binlog

Undo Log、Redo Log 和 Binlog→

最近更新
01
2025
01-15
02
Elasticsearch面试题
07-17
03
Elasticsearch进阶
07-16
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式