InnoDB行格式
MySQL的每条数据都是以一条记录的形式存放在磁盘上的,它们存放的方式被称为行格式或者记录格式。InnoDB中定义了四种类型的行格式,分别是Compact、Redundant、Dynamic和Compressed。在我们创建或修改表的时候就可以指定当前表的行格式:
CREATE TABLE t_user (id int(10) primary key, name varchar(20) ) ROW_FORMAT = Compact;
ALTER TABLE t_user ROW_FORMAT = Compressed;
Compact行格式
记录的真实数据
一条记录的真实数据除了包含我们自定义的各个列的数据之外,还包含三个MySQL默认会为每条记录添加的隐藏列数据,包括行ID、事务ID和回滚指针。
真正的列数据
非null值的列数据会被存储在此处,而null值数据会被记录在额外信息中的NULL值列表中。
隐藏列
列名 | 是否必须 | 描述 |
---|---|---|
DB_ROW_ID | 否 | 行ID,记录的唯一标识,没有主键和Unique键的记录会被自动创建 |
DB_TRX_ID | 是 | 事务ID |
DB_ROLL_PTR | 是 | 回滚指针 |
记录的额外信息
描述和表示这条记录所需的除真实数据以外的信息,主要包含变长字段长度列表、NULL值列表和记录头信息等。
变长字段长度列表
对于varchar(M)等变长类型的字段会被分成两部分存储,一部分即真正的数据内容,被存储在记录的真实数据中,还有一部分代表字段占用的字节数,这一部分一般被存储在额外信息的变长字段长度列表中,按列的顺序逆序排列。
NULL值列表
对于所有可以存储NULL的列都在此处对应一个二进制位,其中“1”代表此列的值为null。这些二进制位按列的顺序逆序排列。
记录头信息
名称 | 字节数 | 描述 |
---|---|---|
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 | 表示下一条记录的相对位置 |