MySQL——Redundant 行格式及行溢出

267 阅读2分钟

1、Redundant 行格式

Redundant 格式是MySQL5.0之前InnoDB的行记录存储方式,是为了兼容之前的版本而保留。

Redundant 格式示意图:

在这里插入图片描述

不同于 Compact 行记录格式,Redundant 行记录格式的首部是一个字段长度偏移列表,同样是按照列的顺序逆序放置的。

字段长度偏移列表 和 变长字段长度列表 的区别:

  • Redundant 行格式会把该条记录中所有列(包括隐藏列)的长度信息都按照逆序存储到字段长度偏移列表。
  • Redundant 行格式计算列值长度的方式不像 Compact行格式那么直观,它是采用两个相邻数值的差值来计算各个列值的长度。

Redundant 行格式的记录头信息

Redundant 行格式的记录头信息固定占用6个字节,

与 Compact行格式的记录头信息相比有两处不同:

  • Redundant行格式多了n_field 和1byte_offs_flag这两个属性。
    • n_field:记录中列的数量
    • 1byte_offs_flag:记录字段长度偏移列表中每个列对应的偏移量
  • Redundant行格式没有record _type这个属性。

2、行溢出

一个数据页默认大小为16KB,换算成byte: 16 * 1024 = 16384 byte,

而一个varchar类型的列最多可以存储65533(除了变长字段长度的两个字节)个字节,这样就可能出现一个数据页存放不了一条记录,这种现象称为行溢出。

Dynamic、Compressed 行格式和 Compact行格式挺像,只不过在处理行溢出数据时有分歧:

  • 在 Dynamic 和 Compressed 行格式中,当行记录的长度没有超过行记录最大长度时,所有数据都会存储在当前页。当行记录的长度超过行记录最大长度时,变长列(variable-length column)会选择外部溢出页(overflow page,一般是Uncompressed BLOB Page)进行分页存储。

  • Compact 和 Redundant 两种行格式保留前768Byte在当前页(B+Tree叶子节点),其余数据存放在溢出页。768Byte后面跟着20Byte的数据,用来存储指向溢出页的指针。

Compressed 行记录格式的另一个功能就是,存储在其中的行数据会以zlib的算法进行压缩,因此对于BLOB、TEXT、VARCHAR这类大长度类型的数据能够进行非常有效的存储