玩命加载中 . . .

4-InnoDB记录存储结构


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的隐藏列作为主键


文章作者: kunpeng
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 kunpeng !
  目录