暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL行格式与行溢出

原创 龙舌兰地落🌏 2024-09-12
231

行格式分类

表的行格式决定了它的行是如何进行物理存储的,反过来说行格式的选择会影响到查询和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.每行记录的真实数据
    图片.png

记录头信息详解:
图片.png

每行记录的真实数据部分,除了插入的列数据以外还有:

  • row_id:隐藏列主键
  • 事务id
  • 回滚指针

compact中的行溢出机制
什么是行溢出?
每个表的数据分成若干页来存储,每个页中采用B树结构存储;
如果某些字段信息过长,无法存储在B树节点中,这时候会被单独分配空间,此时被称为溢出页,
该字段被称为页外列。
如一个页16kb,即16384字节;而一个varchar类型的列最多可以存储65532个字节,一个页就无法存储这个varchar类型的列。如果一个表有这样一个大字段,一个页就无法一条完整的记录,这时候就会发生行溢出,多出的数据就在溢出页中。
当发生行溢出时,数据页只保存前768个字节的前缀数据,以及溢出页地址,指向行溢出页。

参考下图:
图片.png

而dynamic和compressed在处理行溢出时,数据页不会存储真实数据的前768字节,完全溢出到溢出页中,只保留指针指向溢出页

最后修改时间:2024-10-31 14:07:18
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论