Mysql Row Format(行记录格式)

参考:https://dev.mysql.com/doc/refman/5.7/en/innodb-row-format.html


Row format 行记录格式
一个表的行记录格式决定表的行物理存储模式,决定query和dml操作性能。越多的行匹配进独立的磁盘页,query和index查找会快一些,需要的缓存就越少,及io操作。
表由B-tree index和二级索引(secondary  index)组成,B-tree代表了整个表,也称做聚集索引(cluster index),由主键组织划分。聚集索引的节点数据结构包含全部列的值。二级索引的节点包含索引列的值和主键列的值。
变长的列单独存放在磁盘页,也称作溢出页(overflow pages)。这样的列称为页外列,页外列的值存储在溢出页的单链接列表中,每个列有一个或者多个溢出页列表。变长列的prefix存储在B-tree中。

行记录格式表

Row Format

Compact Storage Characteristics

Enhanced Variable-Length Column Storage

Large Index Key Prefix Support

Compression Support

Supported Tablespace Types

Required File Format

REDUNDANT

No

No

No

No

system, file-per-table, general

Antelope or Barracuda

COMPACT

Yes

No

No

No

system, file-per-table, general

Antelope or Barracuda

DYNAMIC

Yes

Yes

Yes

No

system, file-per-table, general

Barracuda

COMPRESSED

Yes

Yes

Yes

Yes

file-per-table, general

Barracuda

1.REDUNDANT
(1)B-tree存储变长列(VARCHAR, VARBINARY, BLOB, TEXT)的前768字节,剩下的部分存储在溢出页中。
(2)固定长度列,超过768字节的视为变长列。
特点:
(1)每个索引记录包括6字节头,头部用于将连续的记录连接在一起,并用于锁定行。
(2)聚集索引中的记录,包括用户定义的全部列。另外,有一个6字节的事务ID和7字节的滚动指针。
(3)如果表中没有定义一个主键,记录也会包含一个6字节的行ID。
(4)每个二级索引记录包含主键列。
(5)每条记录的字段对应一个指针,如果字段的长度少于128字节,指针则是一个字节,否则就是两个字节。指针数组称为记录目录。指针指向的区域为记录的数据部分。
(6)固定长度的列,CHAR(10),以固定长度格式存储。VARCHAR的结尾空格不会截断。
(7)固定长度列大于768字节的,以变长列编码。
(8)SQl-null值存储一个或者两个字节在记录目录中,若为变长数据区域无值。若为固定长度,数据区域存储固定长度,值为null。为NULL保留固定长度允许列由null更新为non-null,避免索引页碎片。

2.COMPACT
compact格式比redundant存储空间减少20%。如果受限于cache命中和磁盘速度,compact格式会快一些,若受限于CPU速度,compact格式会慢一些。
compact格式存储变长列的前768字节于B-tree节点中,剩余部分存储在溢出页中。固定长度大于768字节的以变长列方式处理。
特点:
(1)每个索引记录包含5个字节头部,头部之前可能会有一个变长的头。头部用于链接连续的记录以及行级锁定。
(2)变长记录的头部包含bit向量标志NULL列。若列中可以为NULL的列数量为N,bit向量占CEILING(N/8)字节。头部变长部分也包含变长列的长度,视列最大长度而定,占1个或2字节。若全部列不能为null且有固定长度,记录头部则无变长部分。
(3)对于每个non-null变长字段,记录头部包含一个字节或两个字节长度,存储列长度。若列存储于溢出页或者最大列长度超过255字节,而且实际长度超过127字节时需要两个字节。对于外部存储的列,2字节长度表示内部存储列部分的长度加上指向外部存储的20字节指针。内部存储部分768字节,所以长度为768+20。20字节指针存储列的真实长度。
(4)聚集索引中的记录包括全部用户定义的列。另外,还有一个6字节的事务ID和7字节滚动指针。
(5)如果表内没有定义主键,聚集索引记录则会包含一个6字节的行ID。
(6)每个二级索引记录包含所有主键列。如果有变长的主键列,二级索引记录的头部有一个变长部分记录它们的长度,尽管二级索引定义在固定长度列上。
(7)内部,固定长度字符列以固定长度存储。对于VARCAHR尾部空格部位截断;
(8)对于变长字符,InnoDB尝试用N字节存储Char(N),包括去除尾部空格;若字符字节数超过N,最小字符长度为结尾空格剔除后的值,最大为字符最大字节长度*N。

3.DYNAMIC
基于compact格式,提高存储容量,支持大索引(large index)3072字节,由innodb_large_prefix参数控制。

(1) 行格式为dynamic时,变长列为完全页外存储,聚集索引记录包含一个20字节的指针指向溢出页。固定长度列,超过768字节时,以变长列方式存储。

(2) 列是否存储在页外时,依赖页大小和行总大小。
当一行太长时,将选择最长的列作为页外存储,直到聚集索引记录适合于B-tree页面。TEXT或者BLOB列小于40字节的存储一行。

(3) 可采用系统表空间,独立表空间,普通表空间。

4.COMPRESSED
基于dynamic格式,支持表和索引数据压缩。compressed行格式采用dynamic相同的页外存储细节,和额外的需要压缩的表和索引数据存储,更小的页大小。KEY_BLOCK_SIZE参数控制由多少列数据存储在聚集索引,多少存储在溢出页。Innodb_file_per_table变量必须开启,innodb_file_format必须是barracuda
 

你可能感兴趣的:(Mysql Row Format(行记录格式))