Google Cloud MySQL Engine仅支持InnoDB存储引擎。
创建具有300列的表时出现以下错误。
[Err] 1118-行大小太大(> 8126)。
将某些列更改为TEXT
或BLOB
可能会有所帮助。在当前行格式中,0字节的BLOB
前缀是内联存储的。
我尝试创建一个表,其中包含一些列作为文本类型,另一些列作为blob类型的组合,但是它不起作用。
甚至无法修改innodb_log_file_size
,因为在Google Cloud-SQL平台上不允许这样做。
答案 0 :(得分:1)
您在这里没有太多选择。 InnoDB的默认页面大小为16KB,您必须设计表格,以便页面至少容纳两行。这就是每行8126字节的限制。
像VARCHAR,VARBINARY,BLOB和TEXT这样的可变长度列可以更长,因为超出行大小限制的数据可以存储在额外的页面上。要利用此优势,必须启用梭子鱼表格式,然后选择ROW_FORMAT = DYNAMIC。
在配置中:
[mysqld]
innodb_file_per_table = ON
innodb_file_format = Barracuda
innodb_default_row_format = DYNAMIC;
我不知道这些设置是否已在Google Cloud SQL中启用,或者是否允许您更改这些设置。
阅读https://dev.mysql.com/doc/refman/5.7/en/innodb-row-format.html了解更多信息
同样,DYNAMIC行格式的优点仅适用于可变长度数据类型。如果您有300个固定长度的列(例如CHAR),则无济于事。
顺便说一下,innodb_log_file_size与此有关行大小的错误无关。
答案 1 :(得分:1)
“垂直分区”
具有很多列的表正在推动多个限制;你打了其中一个。有几种合理的解决方法,垂直分区可能是最好的方法,尤其是在TEXT
/ BLOB
中。
具有多个具有相同PRIMARY KEY
的表,而不是单个表,只是一个 可能是AUTO_INCREMENT
。根据需要将它们JOIN
一起收集列。您甚至可以用VIEWs
来隐藏拆分表的事实。我建议根据应用程序对列进行分组,并根据需要对这些列进行“合计”。
不要不要跨列显示事物数组;相反,要有另一个具有多行的表来处理重复。例如:地址1,州1,国家1,地址2,州2,国家2。
除真正固定长度的列外,请勿使用CHAR
或BINARY
。其中大多数都很短。另外,大多数CHAR
列应为CHARACTER SET ascii
,而不是utf8。 (请考虑,country_code
,邮政编码, md5
。)
innodb_log_file_size
仅与您的问题间接相关。有什么价值?
直接相关的是innodb_page_size
,其默认值为16K
,几乎没有人改变过。我希望Cloud Engines禁止对其进行更改。
(我和Bill在一起,希望获得有关您的架构的更多信息-因此我们可以更具体地介绍如何帮助您。)
答案 2 :(得分:0)
为了在Cloud SQL实例上执行您想做的事情,首先运行此命令以设置innodb_strict_mode
变量:
SET innodb_strict_mode = 0 ;
之后,您应该可以创建表格了。