一马平川
不积跬步无以至千里,后继才能薄发

MySQL底层:InnoDB记录结构笔记

2022年05月29日
0
未分类

Mysql底层——InnoDB记录结构

默认 16K 大小一页,每页至少两条记录

名词说明:

W : 某个字符集中单字符的最大字节

M : 某个数据类型能存储的最大字符

L : 实际存储的字节数,最大等于 W * M

行格式

四种行格式:Compact、Redundant、Dynamic(默认)、Compressed

Dynamic:

Compact 的区别在于溢出页,会将溢出的字段整个放入 溢出页 ,在 记录的真实数据 中只记录 溢出页 的地址

Compact:

Compact行格式的结构:
- 变长字段长度列表
- Null值列表
- 记录头信息
- 记录的真实数据

变长字段长度列表

只存储非NULL值

使用1或2字节存储一个字段的长度

情况1:如果 M * W ≤ 255,使用1个字节标识实际占用字节数 L

情况2:如果 M * W > 255时,分两种情况

情况a:如果 L ≤127,则用1个字节标识实际占用的字节数

情况b:如果 L ≥ 127,则用2个字节标识实际占用的字节数

NULL值列表

每列使用1bit空间,按照列的顺序从低位到高位进行存放,1为NULL,0为不为NULL

最小单位为字节,不够则在高位补零

记录头信息

固定用 5 字节组成,用于记录记录是否被删除、B+树每层非叶子节点的最小记录信息等

记录真实的数据

除了定义的列外,还有隐藏的列:

DB_ROW_ID :行ID(非必须)

DB_TRX_ID :事务ID

DB_ROLL_PTR :回滚指针

其中 DB_ROW_ID 不是必须的,生成的规则:如果表没有主键,则使用一个 Unique 字段作为主键,如果没有这个字段,则会添加 DB_ROW_ID 列作为主键。

其中比较特殊的类型

NULL类型

被NULL值列表存储,这里无需重复存储了

CHAR(M)类型

对于不可变长的字符集来说声明多少就占用多少实际空间

对于可变长的字符集,比如utf8mb3,长度就会加 可变长字段长度列表 中,一个字符1-3字节,CHAR类型至少占用 M 个字节,不够再申请新的记录空间

行溢出数据

Innodb数据库单页默认为 16K 大小,如果单页装不下一个记录,则会将溢出的数据放入 溢出页

如果喜欢这篇文章,可以给作者评个份哦~

原文声明: "转载本站文章请注明作者和出处Nothinglin ,请勿用于任何商业用途"

公众号:苦逼的学生仔