Google Cloud MySQL Engine仅支持InnoDB存储引擎。
创建一个包含300列的表时,我收到以下错误。
[Err] 1118 - 行大小太大(> 8126)。
将一些列更改为TEXT
或BLOB
可能会有所帮助。在当前行格式中,0字节的BLOB
前缀以内联方式存储。
我尝试创建一个表,其中一些列的组合作为文本类型,其他一些作为blob类型,但它不起作用。即使修改innodb_log_file_size
也是不可能的,因为Google Cloud-SQL平台不允许这样做。
“垂直分区”
一张有很多列的表正在推动几个限制;你打了其中一个。有几个合理的解决方法,垂直分区可能是最好的,特别是如果很多是TEXT
/ BLOB
。
而不是一个表,有多个表具有相同的PRIMARY KEY
,除了一个可能是AUTO_INCREMENT
。 JOIN
他们在一起根据需要收集列。你甚至可以让VIEWs
隐藏你拆分桌子的事实。我建议根据应用程序通过一些逻辑分组对列进行分组,以及“一起”需要哪些列。
不要在列之间展示一系列事物;相反,让另一个表有多行来处理重复。示例:address1,state1,country1,address2,state2,country2。
除真正的固定长度列外,不要使用CHAR
或BINARY
。大多数都很短。此外,大多数CHAR
列应该是CHARACTER SET ascii
,而不是utf8。 (想想,country_code
,zipcode, md5
。)
innodb_log_file_size
只与您的问题间接相关。它的价值是什么?
直接相关的是innodb_page_size
,默认为16K
,几乎没有人改变过。我希望Cloud Engines禁止更改它。
(我希望Bill能够获得有关您的架构的更多信息 - 所以我们可以更具体地说明如何帮助您。)
你在这里没有太多选择。 InnoDB的默认页面大小为16KB,您必须设计表格,以便在页面中至少有两行。这就是每行8126字节的限制来自的地方。
像VARCHAR,VARBINARY,BLOB和TEXT这样的可变长度列可以更长,因为超出行大小限制的数据可以存储在额外的页面上。要利用此功能,必须启用Barracuda表格式,然后选择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与关于行大小的错误无关。
为了在Cloud SQL实例上执行您想要执行的操作,首先运行此命令以设置innodb_strict_mode
变量:
SET innodb_strict_mode = 0 ;
之后你应该能够创建你的表。