Compact

image.png

  1. 变长字段长度列表:按照列的逆序排列,如定义了一个varchar(200)的字段,在变长字段长度列表中会出现一个使用1个字节表示的200,如果定义了一个varchar(2000)的字段,在变长字段长度列表中会出现一个使用2个字节表示的2000,最多使用2个字节,表示到65535,也就是说innodb中varchar的最大长度为为65535。
  2. NULL标志位:带有default null允许列空,则需要需要1bit来标识,每8个bits的标识组成一个字段。一张表中存在N个varchar字段,那么需要(N+7)/8 (取整)bytes存储所有的NULL标识位
  3. 记录头信息(recoder header):固定占用5个字节,记录的具体信息如下:
    image.png
  4. 实际存储的数据
  5. 事务ID(6个字节)和回滚指针(7个字节)
  6. RowID(6个字节,当没有定义主键时)

    Redundant

    image.png

    Redundant是MySQL5.0之前InnoDB的行记录存储方式。

  7. 字段长度偏移列表:按照列的顺序逆序放置。如第一个字段6bytes,第二个字段7bytes,则记录为0D 06(7+6 6 逆序)

  8. 记录头部信息(record header):固定占用6个字节,记录的信息如下:

image.png
n_fields:记录中列的数量,占用10bit,也就是说MySQL5.0版本之前一行中最多有1023个字段

行溢出数据