【mysql体系结构】InnoDB行格式
公众号:DBA运维笔记
InnoDB存储引擎目前有4种类型的行格式
- Compact
- Redundant
- Dynamic
- Compressed
修改行格式的语法
create table 表名 (列的信息) row_format=行格式名称;
alter table 表名 row_format=行格式名称;
Compact行格式
变长字段长度列表
变长字段占用的存储空间分为两部分:真正的数据内容、占用的字节数。
在compact行格式中,把所有变长字段的真实数据占用字段长度都存放在记录的开头部位,从而形成了一个变长字段长度列表,各变长字段数据占用的字节数按照列的顺序逆序存放。
null值列表
首先统计表中允许存储null的列由哪些
如果表中没有允许存储null的列,则null值列表页不存在了。否则将每个允许存储null的列对应一个二进制位,二进制位按照列的顺序逆序排序。
- 二进制位的值为1时,代表该列的值为null
- 二进制位的值为0时,代表该列的值不为null
mysql规定null值必须用整数个字节的位表示,如果使用的二进制位个数不是整个字节,则在字节的高位补0.
记录头信息
由5个字节组成,5个字节也就是40个二进制位
名称 | 大小(单位:bit) | 描述 |
---|---|---|
预留位1 | 1 | 没有使⽤ |
预留位2 | 1 | 没有使⽤ |
delete_mask | 1 | 标记该记录是否被删除 |
min_rec_mask | 1 | B+树的每层⾮叶⼦节点中的最⼩记录都会添加该标记 |
n_owned | 4 | 表示当前记录拥有的记录数 |
heap_no | 13 | 表示当前记录在记录堆的位置信息 |
record_type | 3 | 表示当前记录的类型,0表示普通记录,1表示 B+树⾮叶⼦节点记录,2表示最⼩记录,3表示 最⼤记录 |
next_record | 16 | 表示下⼀条记录的相对位置 |
mysql会为每个记录默认添加一些列(也称为隐藏列)
列名 | 是否必须 | 占用空间 | 描述 |
---|---|---|---|
DB_ROW_ID | 否 | 6个字节 | 行ID,唯一标识一条记录 |
DB_TRX_ID | 是 | 6个字节 | 事务ID |
DB_ROLL_PTR | 是 | 7个字节 | 回滚指针 |
InnoDB存储引擎会为每条记录都添加DB_TRX_ID和DB_ROLL_PTR列,但是DB_ROW_ID是可选的(在没有自定义主键以及unique键的情况下才会添加该列)。
对于char(M)列,当列采用的是定长字符集时,该列占用的字节数就不会被加到变长字段长度列表,而如果采用变长字符集时,该列占用的字节数也会被加到变长字段长度列表。