MySQL的文件格式file_format与行格式row_format

MySQL的文件格式在5.7之前是只有Antelope(羚羊)一种,在5.7之后新加了一种文件格式Barracuda(梭子鱼)。

所以MySQL的InnoDB引擎有两种文件格式:Antelope和Barracuda。

那怎么查询文件格式呢?如果查询不到说明是默认文件格式。

show variables like "innodb_file_format";

那怎么设置文件格式呢?设置为BARRACUDA需要开启INNODB_LARGE_PREFIX参数。

SET GLOBAL INNODB_LARGE_PREFIX = ON;
SET GLOBAL innodb_file_format = BARRACUDA;

接下来是行格式了。

Antelope文件格式包含:COMPACT 和 REDUNDANT。MySQL5.0之前是REDUNDANT,MySQL5.0之后是COMPACT格式。MySQL5.0之后默认是COMPACT格式。对于 Compact 和 Redundant 行格式,InnoDB将变长字段(VARCHAR, VARBINARY, BLOB 和 TEXT)的前786字节存储在B+树节点中,其余的数据存放在溢出页(off-page)

Barracuda文件格式包含:COMPRESSED 和 DYNAMIC。与这两个新的行格式相关的功能包括:InnoDB表的压缩,长列数据的页外存储和索引建前缀最大长度为3072字节。对于COMPRESSED 和 DYNAMIC行格式,数据页中只存放20个字节的指针,实际的数据存放在Off Page中,之前的Compact 和 Redundant 两种格式会存放768个字前缀字节)。

行格式可以通过修改表来指定或者在创建表时指定。

ALTER TABLE tablename ROW_FORMAT=COMPRESSED;

在 msyql 5.7.9 及以后版本,默认行格式由innodb_default_row_format变量决定,它的默认值是DYNAMIC.

此时查询行格式可以使用SQL来查。如果查询不到说明是默认行格式。

SHOW variables like 'innodb_default_row_format';

如何进行显示设置行格式?

在MySQL5.7.9版本后,除了使用上面修改表可以设置行格式外,还可以指定参数设置。

SET GLOBAL innodb_default_row_format = dynamic;

低的MySQL版本没有这个参数会报错“1193 - Unknown system variable 'innodb_default_row_format'”。


 值得注意的是字符编码会影响字段的最大长度。查看字符编码:

show variables like '%character%';

比如utf8mb4会限制索引字段的最大长度,执行报错

index column size too large. the maximum column size is 767 bytes

此时文件格式设置为BARRACUDA,并且ROW_FORMAT设置为DYNAMIC就OK了。

如果行不通。则把字符编码改回utf8。

参考:这两篇文章比较详细,可以仔细读一下

http://zhongmingmao.me/2017/05/08/innodb-table-page-structure/

https://blog.opskumu.com/mysql-blob.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞翔的咩咩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值