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;