前面已经介绍了InnoDB的数据页结构,我们已经了解了InnoBD种数据和索引的存储结构以及页的概念。现在我们知道了数据库数据是以行存储在页种user record中的,那么现在就来了解下表的行格式。
根据官方描述:
表的行格式决定了其行的物理存储方式,这反过来又会影响查询和 DML 操作的性能。随着更多的行适合单个磁盘页面,查询和索引查找可以更快地工作,缓冲池中需要更少的高速缓存,并且需要更少的 I/O 来写出更新的值。
可变长度列是列值存储在 B 树索引节点中的规则的一个例外。太长而无法放入 B 树页面的可变长度列存储在单独分配的磁盘页面上,称为溢出页面。此类列称为离页列。页外列的值存储在溢出页的单链表中,每个这样的列都有自己的一个或多个溢出页的列表。根据列长度,所有或可变长度列值的前缀都存储在 B 树中,以避免浪费存储空间并不得不读取单独的页面。
存储引擎支持四种行InnoDB
格式:REDUNDANT
、COMPACT
、 DYNAMIC
和COMPRESSED
,默认DYNAMIC
表 14.9 InnoDB 行格式概述
行格式 | 紧凑的存储特性 | 增强的可变长度列存储 | 大索引键前缀支持 | 压缩支持 | 支持的表空间类型 | 所需文件格式 |
---|---|---|---|---|---|---|
REDUNDANT | 不 | 不 | 不 | 不 | system, file-per-table, general | Antelope or Barracuda |
COMPACT | 是的 | 不 | 不 | 不 | system, file-per-table, general | Antelope or Barracuda |
DYNAMIC | 是的 | 是的 | 是的 | 不 | system, file-per-table, general | Barracuda |
COMPRESSED | 是的 | 是的 | 是的 | 是的 | file-per-table, general | Barracuda |
当前引擎中默认行格式为DYNAMIC(动态的),几种行格式基础格式差异不大,根据官网描述:
DYNAMIC
行格式是行格式的一种变 体COMPACT
。有关存储特性,请参阅 COMPACT 行格式存储特性。
那我们就直接看下COMPACT 行格式:
我们向数据库插入一条数据,那么这条数据在磁盘上的存储格式是什么样的呢?
大致介绍下相关内容:
1、变长字段宽度列表(2字节):对于可变长度列的长度时不固定的,该列表用于记录可变列长度字段长度。占用1~2字节。如果行中不存在可变长度列,则栏位不创建不占用空间。
2、null值列表(1~2字节):用于记录null值字段表标识,举个例子:如果插入的数据为 A - null - B 三个字段值,其实行真实数据中存储的是AB,而这次null列表中存储:101 (1代表非null,0标识null),最后查询根据两者的关系确定null值。这样做的目的也是为了节省空间,毕竟使用占位符代替null或者其他方式都是需要消耗空间的。同样的如果行中不存在null值列,即所有列都设置为not null时,该null值列表也不会创建。
3、记录头信息(5字节):记录头信息主要记录着这条数据的一些信息,如下:
---- 000 表示普通记录
---- 001 表示b+树非叶子节点的目录项记录
---- 010 表示infimum记录(即一页中最小的记录)
---- 011 表示supremum记录(即一页中最大的记录)
---- 1** 保留