默认 16K
大小一页,每页至少两条记录
名词说明:
W
: 某个字符集中单字符的最大字节
M
: 某个数据类型能存储的最大字符
L
: 实际存储的字节数,最大等于 W
* M
四种行格式:Compact、Redundant、Dynamic(默认)、Compressed
与 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
大小,如果单页装不下一个记录,则会将溢出的数据放入 溢出页