Compact行格式
变长字段长度列表 |
NULL标志位 |
记录头信息 |
列1数据 |
列2数据 |
…… |
记录的额外信息:
- 这部分信息是服务器为了描述这条记录而不得不额外添加的一些信息,这些额外信息有:变长字段长度列表、null值列表、记录头信息。
(1)变长字段长度列表
MySQL支持一些变长的数据类型,比如varchar(M)、varbinary(M)、Text类型,BLOB类型,这些数据类型修饰列称为变长字段,变长字段中存储多少字节的数据不是固定的,所以在存储真实数据的时候需要把这些数据占用的字节数也存起来,在compact行格式中,把所有变长字段的真实数据占用的字节长度都存放在记录的开头部位,从而形成一个变长字段长度列表。
注意:
- Char是一种固定长度的类型,varchar则是一种可变长度的类型。
- Varchar(M),M代表最大能存多少个字符,MySQL5.0.4之前是字节,之后是字符
(2)Null值列表
Compact行格式会把可以为null的列统一管理起来,存一个标记位在null值列表中,如果表中没有允许存储null的列,则null值列表也不存在了。
- 二进制位的值为1时,代表该列的值为null;
- 二进制位的值为0时,代表该列的值不是null;
(3)记录头信息
除了变长字段长度列表,null值以外,还有一个用于描述记录的记录头信息,它是由固定的5个字节组成。5个字节是40个二进制位,不同的位代表不同的意思:
名称 |
大小(单位:bit) |
描述 |
预留位1 |
1 |
没有使用 |
预留位2 |
1 |
没有使用 |
Delete_mark |
1 |
标记该记录是否被删除 |
Min_rec_mark |
1 |
B+树的每层非叶子节点中的最小记录都会添加该标记 |
N_owned |
4 |
表示当前记录拥有的记录数 |
Heap_no |
13 |
表示当前记录在记录堆的位置信息 |
Record_type |
3 |
表示当前记录的类型,0表示普通记录,1表示B+树非叶子节点记录,2表示最小记录,3表示最大记录 |
Next_record |
16 |
表示下一条记录的相对位置 |
欢迎批评指正,提出问题,谢谢!