默认 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 大小,如果单页装不下一个记录,则会将溢出的数据放入 溢出页