InnoDB以页作为磁盘和内存之间交互的基本单位,页的大小一般为16KB
COMPACT行格式
一条记录可以分为记录的额外信息和记录的真实数据两大部分
- 记录的额外信息
- 变长字段长度列表
- NULL值列表
- 记录头信息
- 记录的真实数据
记录的额外信息
1、变长字段长度列表
对于一些变长的数据类型,比如VARCHAR(M)
、VARBINARY(M)
、各种TEXT
类型,存储变长字段同时也要存储字段的长度,按列的顺序逆序存放
2、NULL值列表
将每个允许存储NULL
的列对应一个二进制位,二进制位按照列的顺序逆序排列
- 二进制位的值为1时,代表该列的值为
NULL
- 二进制位的值为0时,代表该列的值不为
NULL
NULL值列表必须用整数个字节的位表示
3、记录头信息
由固定的5字节组成
名称 | 大小 | 描述 |
---|---|---|
预留位1 | 1 | 没有使用 |
预留位2 | 1 | 没有使用 |
deleted_flag | 1 | 标记该记录是否被删除 |
min_rec_flag | 1 | B+树的每层非叶子节点中最小的目录项记录都会添加该标记 |
n_owned | 4 | 一个页面中的记录会被分为若干个组,每个组的“头”记录的n_owned代表该组的记录条数 |
heap_no | 13 | 表示当前的记录在页面堆中的相对位置 |
record_type | 3 | 表示当前记录的类型,0表示普通记录,1表示B+树非叶子节点的目录项记录,2表示Infimum记录,3表示Supremum记录 |
next_record | 16 | 表示下一条记录的相对位置 |
记录的真实数据
除了自己定义的列的数据外,MySQL会为每个记录默认添加一些列(称为隐藏列)
列名 | 是否必需 | 占用空间 | 描述 |
---|---|---|---|
row_id | 否 | 6字节 | 行ID,唯一标识一条记录 |
trx_id | 是 | 7字节 | 事务ID |
roll_pointer | 是 | 7字节 | 回滚指针 |
InnoDB表的主键生成策略:优先使用用户自定义的主键,如果用户没有定义主键,则选取一个不允许存储NULL值的UNIQUE键作为主键,如果也没有,则默认添加一个名为row_id的隐藏列作为主键