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记录存储结构