mysql innodb 的 row size上限

优惠码大使 2019-08-17

mysql innodb large charset index Create file varchar 存储

mysql innodb 的 row size上限
背景
在项目使用中,出现了以下报错:

Error Code: 1118 - Row size too large (> 8126).
Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help.
In current row format, BLOB prefix of 768 bytes is stored inline.
上面报错,这就涉及到了row size的上限,也有可能会涉及到file format的设置。

一些上限
创建表报错:maximum row size > 65535
创建表报错:row size too large > 8126
插入数据报错:row size too larget > 8126
这里主要讲第三种报错,插入数据的时候触发的报错。先要理清file format和row format两个概念。
个人理解修改这两个参数都有可能解决掉问题。为啥是有可能,因为file format只是部分长字段类型的设置。

File format
先解释下file forma。这是用于varchat或者text字段存储数据的方案。file format有两种,分别是Antelope和Barracuda。

Antelope模式
在MySQL 5.6之前的版本,默认file format是Antelope。
意思是,对于varchar和text字段,会将内容的前768字段放置在index record中,后面再接20个字节的指针。
剩下内容会放置在BLOB page中。

假设有11个text字段,每个字段都是1000字节。那么在插入数据的时候,row size = (768+20)* 11 = 8668 > 8126,将会触发row size too larget > 8126报错。
如果使用Antelope模式,不建议使用超过10个text或varchar字段。

Barracuda模式
Barracude会将所有数据放在BLOB page中,在index record里面只放20个字节的指针。

设置切换
查询File format设置:

show variables like "%innodb_file%";
my.cnf 设置

innodb_file_format = Barracuda #
innodb_file_per_table = 1
innodb_large_prefix = 1
Row format
innodb引擎的行格式(row format)有两种。分别是compact和dynamic/compressed。

ALTER TABLE test ROW_FORMAT=COMPRESSED;

SHOW TABLE STATUS IN test_db;
这里还是之说Antelope模式下使用text的问题。普通的数值类型,其实很难超8126的长度限制,就不说了。在Antelope模式下,text字段的前768会存储在index record中,会占用row size的768+2个字节。所以text/varchar字段不能太多。除非确定不会太长。

验证测试的sql

create table text2
(
text1 longtext,
text2 longtext,
text3 longtext,
text4 longtext,
text5 longtext,
text6 longtext,
text7 longtext,
text8 longtext,
text9 longtext,
text10 longtext,
text11 longtext
) ENGINE=InnoDB DEFAULT CHARSET=ascii;

insert into text2 values(
repeat('y',1000),
repeat('y',1000),
repeat('y',1000),
repeat('y',1000),
repeat('y',1000),
repeat('y',1000),
repeat('y',1000),
repeat('y',1000),
repeat('y',1000),
repeat('y',1000),
repeat('y',1000)
);

insert into text2 values(
repeat('y',1000),
repeat('y',1000),
repeat('y',1000),
repeat('y',1000),
repeat('y',1000),
repeat('y',1000),
repeat('y',1000),
repeat('y',1000),
repeat('y',1000),
repeat('y',1000),
repeat('y',197) # repeat('y',198) error
);


create table text3
(
text1 longtext,
text2 longtext,
text3 longtext,
text4 longtext,
text5 longtext,
text6 longtext,
text7 longtext,
text8 longtext,
text9 longtext,
text10 longtext,
text11 longtext
) ENGINE=INNODB DEFAULT CHARSET=ascii ROW_FORMAT=COMPRESSED;

insert into text3 values(
repeat('y',1000),
repeat('y',1000),
repeat('y',1000),
repeat('y',1000),
repeat('y',1000),
repeat('y',1000),
repeat('y',1000),
repeat('y',1000),
repeat('y',1000),
repeat('y',1000),
repeat('y',1000)
);
作者:Ron Ngai
出处:http://rondsny.github.io

登录 后评论
下一篇
冒顿单于
6662人浏览
2019-08-28
相关推荐
MySQL管理之日志详解
702人浏览
2017-11-13 03:44:00
MySQL 5.7新特性
5538人浏览
2016-09-14 19:38:48
mysql日志详细解析
1824人浏览
2015-08-17 18:36:00
MySQL日志详解
1527人浏览
2016-02-24 13:31:00
MySQL之最
7395人浏览
2017-10-18 10:10:59
MySQL之最
845人浏览
2017-10-23 15:05:54
Mysql日志解析
737人浏览
2017-12-05 19:42:00
MySQL 5.5 日志管理
618人浏览
2017-11-16 20:53:00
mysql日志详细解析
433人浏览
2017-11-12 02:18:00
MySQL 5.5 日志管理
481人浏览
2017-11-08 05:28:00
MySql高级四--mysql日志
399人浏览
2017-11-17 15:39:00
Mysql日志详解
488人浏览
2017-11-09 16:48:00
MySQL 日志管理详解
555人浏览
2017-11-12 16:40:00
mysql日志详细解析
263人浏览
2015-07-15 14:25:29
0
0
0
103