InnoDB记录存储结构

InnoDB是一个将数据存储到磁盘上的存储引擎。对于更新/写入的数据,先将数据从磁盘中加载到内存,更新后再将数据刷新到磁盘。

行格式

而磁盘与内存交互的数据,InnoDB采取将数据分为若干,一页一般为16kb,以页为单位磁盘与内存之间交互传输。表中的数据一般是以记录为单位进行操作,页中最少存储两条记录,而记录在磁盘上存放的方式被称为行格式/记录格式;

在创建表时声明 ROW_FORMAT=行格式名称

InnoDB设计了四种行格式

  • compact

image_1c9g4t114n0j1gkro2r1h8h1d1t16.png-42.4kB

记录的额外信息
  •  变长字段长度列表:变长字段即varchar/varchary/text/blob等,列表内存放记录中这些字段真实数据占用的字节长度,列表形式按列的顺序逆序存放;
    •  表示真正字符占用的字节数:如果某个可变字段允许存储的最大字节数(字符数*字符集maxLen)超过255字节并且真实存储的字节数超过127字节则使用2个字节,反之1个字节。那么总的字节数为各个变长字段占用字节数相加。不保存null值列的长度。如果没有变长字段则没有这个部分。
  •   NULL值列表:存储该记录值为null的列。
    • 首先统计允许存储null的列,并将每个允许存储null的列对应一个二进制位(列值为null二进制为1,反之为0),二进制位按照列的顺序逆序排列;
    • 最后,null值列表表示需为整数个字节(一个字节8位),即二进制位个数没有满足的高位补0,比如有三个字段可为null,不足一个字节,那么表示为00000111,十六进制为0x07,如果表中有超过9个字段均为null,则用两个字节表示。
  •  记录头信息:由5个字节(40位)组成。
  •    记录的真实数据:除了用户自定义的列,MySQL还会为每个记录默认添加一些列
    • DB_ROW_ID:没有定义主键及唯一键才会添加
    • DB_TRX_ID
    • DB_ROLL_PTR
  •  真实列:
    • 不管什么字符集下,某字段声明为char(10),但实际长度为2字节,那么将会用空格字符填充剩下8个 字节;varchar没有这个要求。

对于CHAR(M)类型的列来说,当列采用的是定长字符集时,该列占用的字节数不会被加到变长字段长度列表,而如果采用变长字符集时,该列占用的字节数也会被加到变长字段长度列表

    • 当前记录,某字段实际值为null,将存储在null值列表,不在这里存储
    • 每个字段存储以字符集对应形式存储
  • redundant
  • dynamic
  • compressed
原文地址:https://www.cnblogs.com/hangzhi/p/10947974.html