行格式分类
表的行格式决定了它的行是如何进行物理存储的,反过来说行格式的选择会影响到查询和DML操作的性能。
我们希望在单个page中能容纳更多的行,查询和索引查找就可以更快地工作,缓冲池中所需的内存更少,写入更新的时候所需I/O更小。
InnoDB存储引擎支持四种行格式:
- REDUNDANT(冗余),被淘汰了
使用REDUNDANT行格式,表会将变长列值的前768字节存储在B树节点的索引记录中,其余
的存储在溢出页上。对于大于等于786字节的固定长度字段InnoDB会转换为变长字段,以便
能够在页外存储。 - COMPACT(紧凑),经常会使用
与REDUNDANT行格式相比,COMPACT行格式减少了约20%的行存储空间,但代价是增加了
某些操作的CPU使用量。如果系统负载是受缓存命中率和磁盘速度限制,那么COMPACT格式
可能更快。如果系统负载受到CPU速度的限制,那么COMPACT格式可能会慢一些。 - DYNAMIC(动态),新引入,与compact类似,可以进行数据压缩,默认的
使用DYNAMIC行格式,InnoDB会将表中长可变长度的列值完全存储在页外,而索引记录只
包含指向溢出页的20字节指针。大于或等于768字节的固定长度字段编码为可变长度字段。
DYNAMIC行格式支持大索引前缀,最多可以为3072字节,可通过innodb_large_prefix参数
控制。 - COMPRESSED(压缩),新引入,算法不同,更加节省空间
COMPRESSED行格式提供与DYNAMIC行格式相同的存储特性和功能,但增加了对表和索引
数据压缩的支持。
查看默认行格式:
show variables like '%innodb_default_row_format%';
创建表的时候也可以指定行格式,在后面加ROW_FORMAT=行格式名称即可。
行溢出
由COMPACT行格式来说行溢出问题。
COMPACT行格式特点:
COMPACT行格式设计的目标就是高效的存储数据,一个页存储更多行记录。
由两部分组成:
- 1.每行记录的额外信息
- 2.每行记录的真实数据
记录头信息详解:
每行记录的真实数据部分,除了插入的列数据以外还有:
- row_id:隐藏列主键
- 事务id
- 回滚指针
compact中的行溢出机制
什么是行溢出?
每个表的数据分成若干页来存储,每个页中采用B树结构存储;
如果某些字段信息过长,无法存储在B树节点中,这时候会被单独分配空间,此时被称为溢出页,
该字段被称为页外列。
如一个页16kb,即16384字节;而一个varchar类型的列最多可以存储65532个字节,一个页就无法存储这个varchar类型的列。如果一个表有这样一个大字段,一个页就无法一条完整的记录,这时候就会发生行溢出,多出的数据就在溢出页中。
当发生行溢出时,数据页只保存前768个字节的前缀数据,以及溢出页地址,指向行溢出页。
参考下图:
而dynamic和compressed在处理行溢出时,数据页不会存储真实数据的前768字节,完全溢出到溢出页中,只保留指针指向溢出页