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)

MySQL的文件格式file_format与行格式row_format_第1张图片

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

MySQL的文件格式file_format与行格式row_format_第2张图片

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

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

你可能感兴趣的:(MySQL,mysql)