InnoDB
存储引擎提供了 compact
(5.1 后的默认格式) 和 redundant
两个格式来存放行记录数据,redundant
格式是为了兼容之前的版本而保留。
这里主要介绍下 compact
行记录格式。
- 变长字段长度列表**:如果列的长度小于 255 字节,用 1 字节表示;如果大于 255 个字节,用 2 字节表示
- NULL标志位**:表明该行数据是否有NULL值。占一个字节。
- 记录头信息**:固定占用 5 字节,每位的含义如下:
名称 | 大小(bit) | 描述 |
---|---|---|
() | 1 | 未知 |
() | 1 | 未知 |
delete_flag | 1 | 该行是否已被删除 |
min_rec_flag | 1 | 为1,如果该记录是预先被定义为最小的记录 |
n_owned | 4 | 该记录拥有的记录数 |
heap_no | 13 | 索引堆中该记录的排序记录 |
record_type | 3 | 记录类型,000表示普通,001表示B+树节点指针,010表示infimum,011表示supermum,1xx表示保留 |
next_record | 16 | 页中下一条记录的相对位置 |
在每个行记录中,还有两个隐藏列,事务 ID 和回滚指针,分别为 6 字节和 7 字节。若 InoDB 表没有定义主键,也没有不包含 NULL 的唯一索引,每行还会增加一个 6 字节的 ROW_ID 列作为主键。
InnoDB 聚簇索引 B+ 树叶结点 compact 格式行记录.png InnoDB 二级索引 B+ 树叶结点 compact 格式行记录.png可以看到,二级索引记录是没有事务 ID 和回滚指针的。
纠正认知误区:InnoDB 不管是聚簇还是二级索引的 B+ 树叶结点,存储的都是一个 compact
格式的行记录,其中同时包含了以往认知中的索引关键字的值与数据记录的值。
参考:https://blog.jcole.us/2013/01/10/the-physical-structure-of-records-in-innodb
网友评论