暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Redundant行格式

Ty3306 2022-09-12
644

Redundant行格式

Redundant是MySQL 5.0版本之前InnoDB的行记录存储方式,MySQL 5.0支持Redundant是为了兼容之前版本的页格式。

现在我们把表record_test_table的行格式修改为Redundant:

ALTER TABLE record_test_table ROW_FORMAT=Redundant;
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: o Warnings: 0


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

注意Compact行格式的开头是变长字段长度列表,而Redundant行格式的开头是字段长度偏移列表,与变长字段长度列表有两处不同:

少了“变长”两个字:Redundant行格式会把该条记录中所有列(包括隐藏列)的长度信息都按照逆序存储到字段长度偏移列表。
多了“偏移”两个字:这意味着计算列值长度的方式不像Compact行格式那么直观,它是采用两个相邻数值的差值来计算各个列值的长度。
举例:比如第一条记录的字段长度偏移列表就是:

2B 25 1F 1B13 0C 06

因为它是逆序排放的,所以按照列的顺序排列就是:

06 0C 1317 1A24 25

按照两个相邻数值的差值来计算各个列值的长度的意思就是:

第一列(row_id)的长度就是Ox06个字节,也就是6个字节。
第二列(transaction_id)的长度就是(OxOC- 0x06)个字节,也就是6个字节。
第三列(roll_pointer)的长度就是(Ox13 - oxOC)个字节,也就是7个字节。
第四列(col1)的长度就是(Ox1B- Ox13)个字节,也就是8个字节。
第五列(col2)的长度就是(Ox1F - Ox1B)个字节,也就是4个字节。
第六列(col3)的长度就是(Ox25 - Ox1F)个字节,也就是6个字节。
第七列(col4)的长度就是(Ox2B - Ox25)个字节,也就是6个字节。
不同于Compact行格式,Redundant行格式中的记录头信息固定占用6个字节(48位),每位的含义见下表。


与Compact行格式的记录头信息对比来看,有两处不同:

Redundant行格式多了n_field和1byte_offs_flag这两个属性。
Redundant行格式没有record_type这个属性。
其中,n_fields:代表一行中列的数量,占用10位,这也很好地解释了为什么MySQL一个行支持最多的列为1023。另一个值为1byte_offs_flags,该值定义了偏移列表占用1个字节还是2个字节。当它的值为1时,表明使用1个字节存储。当它的值为0时,表明使用2个字节存储。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论