Compact行格式是在MySQL5.0中引入的,为了高效的存储数据,简单的说,就是为了让一个页(Page)存放的行数据越多,这样性能就越高。
Compact 行格式示意图如下:
1、变长字段长度列表:变长的数据类型(VARCHAR、VARBINARY、TEXT)修饰的列称为变长字段,变长字段长度最大不超过2字节(MySQL数据库varcahr类型的最大长度限制为65535)。Compact行格式中,把所有变长字段的真实数据占用的字节长度都存放在记录的开头部位,从而形成一个变长字段长度列表。
2、NULL值列表:该位指示了该行数据中是否有NULL值,Compact行格式会把可以为NULL的列统一管理起来,存在一个标记为NULL值列表中。如果表中没有允许存储 NULL 的列,则 NULL值列表也不存在了。
- 二进制位的值为1时,代表该列的值为 NULL
- 二进制位的值为0时,代表该列的值不为 NULL
3、记录头信息:固定占用5字节(40位)
4、记录的真实数据:实际存储每列的数据,NULL不占该部分任何空间,即NULL占有NULL标志位,实际存储不占任何空间。记录的真实数据除了实际存储每列的数据外,还会有三个隐藏列:
| 列名 | 是否必须 | 占用空间 | 描述 |
|---|---|---|---|
| row_id | 否 | 6字节 | 行ID,唯一标识一条记录 |
| transaction_id | 是 | 6字节 | 事务ID |
| roll_pointer | 是 | 7字节 | 回滚指针 |
一个表没有手动定义主键,则会选取一个Unique键作为主键,如果连Unique键都没有定义的话,则会为表默认添加一个名为row_id 的隐藏列作为主键。所以row_id是在没有自定义主键以及Unique键的情况下才会存在的。