InnoDB记录存储结构

Posted hangzhi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了InnoDB记录存储结构相关的知识,希望对你有一定的参考价值。

InnoDB是一个将数据存储到磁盘上的存储引擎。对于更新/写入的数据,先将数据从磁盘中加载到内存,更新后再将数据刷新到磁盘。而磁盘与内存交互的数据,InnoDB采取将数据分为若干页,一页一般为16kb,以页为单位磁盘与内存之间交互传输。

行格式:表中的数据一般是以记录为单位进行操作,而记录在磁盘上存放的方式被称为行格式/记录格式;在创建表时声明 ROW_FORMAT=行格式名称

InnoDB设计了四种行格式

  • compact

技术图片

记录的额外信息

变长字段长度列表:变长字段即varchar/varchary/text/blob等,列表内存放记录中这些字段真实数据占用的字节长度,列表形式按列的顺序逆序存放;

1. 表示真正字符占用的字节数:如果某个可变字段允许存储的最大字节数(字符数*字符集maxLen)超过255字节并且真实存储的字节数超过127字节则使用2个字节,反之1个字节。那么总的字节数为各个变长字段占用字节数相加。不保存null值列的长度。如果没有变长字段则没有这个部分。

NULL值列表:存储该记录值为null的列。

1.首先统计允许存储null的列,并将每个允许存储null的列对应一个二进制位(列值为null二进制为1,反之为0),二进制位按照列的顺序逆序排列;

2.最后,null值列表表示需为整数个字节(一个字节8位),即二进制位个数没有满足的高位补0,比如有三个字段可为null,不足一个字节,那么表示为00000111,十六进制为0x07,如果表中有超过9个字段均为null,则用两个字节表示。

记录头信息:由5个字节(40位)组成。

记录的真实数据:除了用户自定义的列,mysql还会为每个记录默认添加一些列

DB_ROW_ID:没有定义主键及唯一键才会添加

DB_TRX_ID

DB_ROLL_PTR

真实列:1.不管什么字符集下,某字段声明为char(10),但实际长度为2字节,那么将会用空格字符填充剩下8个 字节;varchar没有这个要求。

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

2.当前记录,某字段实际值为null,将存储在null值列表,不在这里存储

3.每个字段存储以字符集对应形式存储

  • redundant
  • dynamic
  • compressed

 

以上是关于InnoDB记录存储结构的主要内容,如果未能解决你的问题,请参考以下文章

MySQL的varchar水真的太深了——InnoDB记录存储结构

MySQL的varchar水真的太深了——InnoDB记录存储结构

MySQL的varchar水真的太深了——InnoDB记录存储结构

_InnoDB数据存储结构

MySQL高级--05--InnoDB数据存储结构---行格式(或记录格式)

MySQL-3 行记录的存储结构