InnoDB 行格式

InnoDB有COMPACT、REDUNDANT、DYNAMIC和COMPRESSED四种行格式,建表时可以用create table tableName (...) row_format = 行格式指定行格式。


COMPACT行格式

COMPACT行格式示意图如下


image.png

变长字段长度列表
变长字段(如varchar、text、blob等类型)实际占用的字节数;
如果某一列占用的字节数特别多,只会留一部分数据在本页中,其余部分放到溢出页,变长字段长度列表存的只是留在本页中的字节数

NULL值列表
对每一个允许为NULL的列,用1个字节表示该列是否为NULL,1表示NULL,0表示非NULL

记录头信息


image.png

记录的真实数据
除了建表时定义的几个列,mysql会为每一行记录都添加几个隐藏列

列名 是否必需 功能
row_id 主键
trx_id 事务ID
roll_pointer 回滚指针

如果建表时定义了primary key,mysql会把该列作为主键,否则,会选择一个不允许NULL值的UNIQUE列作为主键,如果没有不允许NULL值的列,mysql会为每一行记录添加一个row_id作为主键。
trx_id和roll_pointer在实现mvcc的时候会有用。

REDUNDANT行格式

REDUNDANT行格式是mysql 5.0之前使用的行格式,属于非紧凑型,另外三种行格式都是紧凑型,REDUNDANT占用空间比另外三种都要大,具体格式不做介绍

DYNAMIC和COMPRESSED行格式

DYNAMIC和COMPRESSED行格式与COMPACT类似,只是处理溢出页的时候有所不同,对于占用空间较大的列,它们不会留一部分数据在本页中,而是全部放到溢出页。
COMPRESSED会使用压缩算法对页面进行压缩,以节省空间。
DYNAMIC是mysql 5.7默认的行格式。

你可能感兴趣的:(InnoDB 行格式)