MySQL-InnoDB行格式(记录存储格式)

简述

InnoDB将数据存储在磁盘实现持久化,而在进行运算的时候要把数据从磁盘读取到内存中进行运算,InnoDB不会一条一条记录进行磁盘IO,这样效率太慢,为了加快效率,InnoDB以页结构作为磁盘和内存的基本交互单位,默认情况下一个页的大小为16KB,在Mysql启动之后这个值就没法再修改了,页中保存着我们真正的数据记录(一个页至少保存两条记录)。

行格式

行格式是记录在磁盘存储的格式,目前有四种行格式,COMPACT、REDUNDANT、DYNAMIC、COMPRESSED。我们可以在创建表的时候指定使用什么行格式,也可以在之后修改表的结构。

CREATE TABLE 表名(列)ROW_FORMAT = 行格式的名称;
ALTER TABLE 表名 ROW_FORMAT = 行格式的名称;

几种行格式有非常大的相似性,因此只要搞懂了一种其他的格式都是照葫芦画瓢。

COMPACT

COMPACT格式存储一条记录的格式如下所示:
在这里插入图片描述

  1. 变长字段长度列表:如果一个列存储的是可变长度的数据(VARCHAR,VARBINARY,TEXT,BLOB等),那么COMPACT格式的变长字段长度列表就会记录该字段占用了多少字节,也就是一条变长字段InnoDB不止存储了它的真实数据同时还保存了它占用的字节数。我们可以举个例子,加入我们现在有C1,C2,C3都是可变长度VARCHAR类型的,C1=“aaaa”,C2=“bbb”,C3=“cc”,那么他的变长字段长度列表记录就是02 03 04。变长字段长度列表不会记录非变长的字段长度。
  2. NULL值列表:一条记录中可能有多个NULL,假如在真实数据中都记录这些NULL,非常浪费空间,因此NULL值列表会记录那些列的值为NULL,假如我们C1,C2,C3都是允许NULL的的,假如C1,C3为null,那么此时NULL值列表为“00000101”只用一个字节的后三位就可以记录C1,C3为NULL,如果运行为NULL的列数量超过8,则NULL值列表占用的字节数量也会改变,在例子中只有三个列,因此NULL值列表占用的字节数量为1,C1和C3被列表记录之后,真实数据就不会存储C1和C3了。
  3. 记录头信息:保存着记录的一下信息,比如记录是否被删除了,下一条记录的相对地址。
  4. 真实数据:InnoDB保存我们的数据的时候会添加一些其他的数据,他们是:
    • row_id:创建表的时候没有指定主键,InnoDB就会给我们添加这个字段,如果有主键则不会。
    • trx_id:一定存在的字段,保存操作这个记录的事务ID。
    • roll_pointer:一定存在的字段,回滚指针,与undoLog有关。

CHAR(M)的存储格式

假如我们现在有一个字段为CHAR(10),在字符集为ASCii的情况下,无论这个字段当前使用了多少个字节这个字段在InnoDB中存储都是占10个字节,如果我们使用的是其他的字符集像gbk、utf8,则该字段会被当成可变长度的字段进行处理。

REDUNDANT

REDUNDANT与COMPACT相差的不多,其结构如下:
在这里插入图片描述
字段长度偏移链表:保存记录中所有列的长度信息,通过偏移量的方式保存。举个例子,假如一条记录的字段长度偏移链表为13 0C 06,意思就是:
第一列:长度为0x06个字节,也就是6个字节
第二列:长度为 0x0C - 0x06个字节,也就是6个字节
第三列:长度为 0x13 - 0x0C 个字节,也就是7个字节

如何保存NULL值

REDUNDANT用真实数据的第一位来表示该数据是否是NULL,第一位为1,则是NULL。

COMPACT和REDUNDANT处理溢出列

Mysql规定一个页为16KB并且最少存储两个行,而页开始有其他的额外信息132字节,每个行也有自己的额外信息27字节。
行的额外信息主要是:

  • 2个字节存储数据长度
  • 1个字节存储NULL
  • 5个字节头信息
  • 6个字节的row_id列
  • 6个字节的trx_id列
  • 7个字节的roll_pointer列

因此列的大小为:132 + 2 * (27 + n) < 16384 , n < 8099。
也就是假如我们只有一个列,那么这个列不能超过8099,如果超过就会发生溢出。COMPACT和REDUNDANT对溢出列的处理,是把数据分割成多个页,真实数据列只保存该溢出列的前768个字节,然后通过一个20字节的指针指向其他页。
在这里插入图片描述

DYNAMIC、COMPRESSED行格式

DYNAMIC、COMPRESSED和COMPACT非常像,只是在处理溢出页的时候不会在真实数据保存前768个字节,只会保存指针。而COMPRESSED会对页进行压缩。MySQL 5.7的时候默认行格式为DYNAMIC。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值