InnoDB有COMPACT、REDUNDANT、DYNAMIC和COMPRESSED四种行格式,建表时可以用create table tableName (...) row_format = 行格式
指定行格式。
COMPACT行格式
COMPACT行格式示意图如下
变长字段长度列表
变长字段(如varchar、text、blob等类型)实际占用的字节数;
如果某一列占用的字节数特别多,只会留一部分数据在本页中,其余部分放到溢出页,变长字段长度列表存的只是留在本页中的字节数
NULL值列表
对每一个允许为NULL的列,用1个字节表示该列是否为NULL,1表示NULL,0表示非NULL
记录头信息
记录的真实数据
除了建表时定义的几个列,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默认的行格式。