Mysql-InnoDB行记录格式

InnoDB行记录格式

InnoDB存储引擎是面向列的,就是说数据是按照行进行存放的. 每个页存放的行记录也是有硬性定义的,最多允许存放16KB/2-200行的记录.这里主要介绍两种行记录格式.Compact和Redundant格式.

Compact行记录格式

首先首部是一个非NULL变长字段长度列表,并且是按照列的顺序逆序放置的,其长度为:

  • 若列的长度小于255字节,用1字节表示
  • 若大于255字节,用2字节表示

变长字段的长度最大不可以超过2字节,因为在MySQL数据库中varchar类型的最大长度限制为65535.
也就是列表中的最后一个数据就是表中第一个变长字段的数据列的数据的长度.

变长字段之后的第二个部分就是NULL标志位,该位只是了该行数据中是否有NULL值,有则用1表示,该部分所占的字节为1字节.记下来是记录头信息,占用5字节.主要含义为:

这里的n_owned是该记录拥有的记录数,因为在InnoDB中,页中的行数据是存储在一个个槽中的,每个槽中可能有多条数据,这个值就是记录所在的槽中有几条记录的.
最后就是实际的每个列的数据. 这里需要注意的是,NULL不占该部分任何空间.就是NULL除了有NULL标志位外,没有任何的存储空间.
每行数据除了用户定义的列之外,还有两个隐藏列,事务ID列和回滚指针列.如果没有制定主键,还会增加一个6字节的worid列.

Redundant行记录格式


首部不同与Compact,这里存储的是字段长度偏移列表.同样按照列的顺序逆序放置.是判断每一列的起始位置的偏移量来找见每个列的.
记录头信息:

对于Redundant记录格式,记录头占用6字节,其中n_fields值代表一行中列的数量.占10位,也就是最多有1023个列.

对于NULL值的处理与Compact不一样,在REdundant中只有varchar的NULL值不占空间,而其他确定长度的字段类型还是要占用空间.而Compact中都不占用空间.