MySQL支持如下4种行格式:

  • REDUDENT:兼容老版本的InnoDB,MySQL 4.1版本之前
  • COMPACT:MySQL 5.6 版本的默认格式
  • DYNAMIC:大对象记录优化,MySQL 5.7 版本默认格式
  • COMPRESSED:支持压缩

COMPACT结构

variable string length list | NULL flag | record header | coll | col2 ..
  • variable string length list:表示有多少个变长字段(varchar,varbinary,text等),且逆序存放(为了提高CPU的cache的命中率),例如,有三个varchar字段,则记录为 03 02 01
  • NULL flag:表示是否有NULL值(1个字节)
  • record header,5个字节,比较底层(比如看该记录有没有被删除),不需要关心
  • rowid:隐藏列,B+树的索引键值没有主键则使用全局ROWID,6字节
  • trx id:隐藏列,事务ID,6个字节
  • roll pointer:隐藏列,回滚指针,7个字节
  • 表中其它的定义列

DYNAMIC

DYNAMIC相比COMPACT,优化了大对象记录的存储。

假设有一条记录有 A,B,C,D 四列,其中D列的是text类型,且含有2W个字节的长度。COMPACT会存储text中的前768个字节的数据,剩余的数据通过指针(20个字节)指向溢出页。DYNAMIC不存储前768个字节数据,只存储20B的指针。这样一来,DYNAMIC在一个页中存储的记录数更多,可以有效降低B+树高度,IO性能更好。

COMPRESSED

create/alter table xxx row_format=compressed;
-- By 许望(RHCA、OCM、VCP)
最后修改:2020 年 01 月 14 日 10 : 07 AM
如果觉得我的文章对你有用,请随意赞赏