目录
1. 简介及其格式之间关系
1.1 关系结构
1.2 简介
在早期的InnoDB版本中,由于文件格式只有一种,因此不需要为此文件格式命名。随着InnoDB引擎的发展,开发出了不兼容早期版本的新文件格式,用于支持新的功能。为了在升级和降级情况下帮助管理系统的兼容性,以及运行不同的MySQL版本,InnoDB开始使用命名的文件格式。
InnoDB 1.0.x版本引入了新的文件格式(新的页格式),在InnoDB行记录格式中说的Compact行记录格式和Redundant行记录格式称为Antelope文件格式。新的文件格式称为Barracuda文件格式。Barracuda文件格式下有Compressed行记录格式和Dynamic行记录格式
1. Antelope: 先前未命名的,原始的InnoDB文件格式。MySQL5.6的默认文件格式。可以与早期的版本保持最大的兼容性。不支持 Barracuda 文件格式。
2. Barracuda: 新的文件格式。它支持InnoDB的所有行格式,相关的功能包括:InnoDB表的压缩,长列数据的页外存储和索引建前缀最大长度为3072字节。
在 msyql 5.7.9 及以后版本,默认行格式由innodb_default_row_format变量决定,它的默认值是DYNAMIC,也可以在 create table 的时候指定ROW_FORMAT=DYNAMIC。用户可以通过命令 SHOW TABLE STATUS LIKE'table_name' 来查看当前表使用的行格式,其中 row_format 列表示当前所使用的行记录结构类型。
2. Compact行记录格式
Compact 行格式 | ||||||||
变长字段长度列表 | null值列表 | 记录头部信息 | 隐藏列 | 数据列 | ||||
RowID(6字节)如果没有定义主键会添加 | TransactionID(6字节)事务列 | Roll Point(7字节)回滚指针列 | 列1 | 列2 | …… |
2.1 变长字段长度列表:
一些列是变长的,因为字符集可能是变长的,或者列的数据类型比如blob或者varchar这种,对于这样的数据列的值,innodb存储时肯定需要具体的数据长度,这个长度就是存在变长字段长度列表里的;变长字段长度最大不超过2字节(MySQL数据库varcahr类型的最大长度限制为65535)
2.2 null值列表:
可空列如果没有数据,innodb不会在记录里存一个null,而是将其记录在null值列表中,这个列表本质上是通过字节的bit位来代表空列的,每一个bit位对应一个可空的列,用0和1表示是否为空。
2.3 头信息:
2.3.1序列及其大小
记录头信息 | |||||||||||||||||||||||||||||||||||||||
预留位1 | 预留位2 | delete_mask | min_rec_mask | n_owned | heap_no | record_type | next_record | ||||||||||||||||||||||||||||||||
2.3.2 字段说明
名称 | 大小(单位:bit) | 描述 |
预留位1 | 1 | 预留位1 |
预留位1 | 1 | 预留位1 |
delete_mask | 1 | 标记该记录是否被删除 |
min_rec_mask | 1 | B+树的每层非叶子节点中的最小记录都会添加该标记 |
n_owned | 4 | 表示当前记录(组内)拥有的记录数 Infimun分组的值为1 Supremum分组的值为1~8 普通分组4~8 仅槽记录存在该值 |
的heap_no | 13 | 表示当前记录在记录堆的位置信息 |
record_type | 3 | 表示当前记录的类型,0表示普通记录,1表示B+树非叶子节点记录,2表示最小记录,3表示最大记录 |
next_record | 16 | 表示下一条记录的相对位置 |
3.Redundant行记录格式
Redundant | ||||||||
字段长度偏移列表 | 记录头部信息 | 隐藏列 | 数据列 | |||||
RowID(6字节)如果没有定义主键会添加 | TransactionID(6字节)事务列 | Roll Point(7字节)回滚指针列 | 列1 | 列2 | 列3 | …… |
3.1 字段长度偏移列表
是按照列的顺序逆序放置的。当列的长度小于255字节,用1字节表示;若大于255个字节,用2个字节表示
3.2 记录头信息
行格式固定占用6个字节(48位)
3.3.1序列及其大小
记录头信息 | |||||||||||||||||||||||||||||||||||||||||||||||
预留位1 | 预留位2 | delete_flag | min_rec_flag | n_owned | heap_no | n_fielfs | 1byte_off_flag | next_record | |||||||||||||||||||||||||||||||||||||||
3.3.2 字段说明
名称 | 大小(单位:bit) | 描述 |
预留位1 | 1 | 预留位1 |
预留位1 | 1 | 预留位1 |
delete_flag | 1 | 标记该记录是否被删除 |
min_rec_flag | 1 | 如果为1则该记录是预先被定义为最小的记录 |
n_owned | 4 | 表示当前(组内)记录拥有的记录数 Infimun分组的值为1 Supremum分组的值为1~8 普通分组4~8 仅槽记录存在该值 |
heap_no | 13 | 表示当前记录在记录堆的位置信息 |
n_fields | 10 | 疾苦中列的数量 |
1byte_offs_flag | 1 | 偏移列表为1个字节还是2个字节 |
next_record | 16 | 表示下一条记录的相对位置 |
4.Dynamic行记录格式
DYNAMIC 与 COMPACT 几乎相同,但每个 BLOB 字段仅使用 20 个字节。(COMPACT 记录中存储前 768 个字节的 BLOB)
4.1 优势
(1)记录中可能有更多的 BLOB 字段。
(2)压缩表
5. Compressed行记录格式
更好的压缩表