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