谷歌云MySQL引擎仅支持InnoDB存储引擎。
在创建一个包含300列的表时,我遇到了以下错误。
[Err]1118-行大小过大(>8126(。
将某些列更改为TEXT
或BLOB
可能会有所帮助。在当前行格式中,0字节的BLOB
前缀以内联方式存储。
我尝试创建一个表,其中一些列作为文本类型,另一些列作为blob类型,但没有成功。即使是修改innodb_log_file_size
也是不可能的,因为它在Google Cloud SQL平台上是不允许的。
"垂直分区">
一个有很多列的表正在突破几个极限;你打了其中一个。有几种合理的解决方案,垂直分区可能是最好的,尤其是如果许多是TEXT
/BLOB
。
除了一个可以为AUTO_INCREMENT
之外,使用多个具有相同PRIMARY KEY
的表来代替单个表。JOIN
根据需要将它们组合在一起以收集列。您甚至可以使用VIEWs
来隐藏拆分表的事实。我建议根据应用程序和需要"一起"使用的列进行一些逻辑分组。
不要在列之间显示事物数组;相反,使用另一个具有多行的表来处理重复。示例:address1,state1,country1,address2,state2,country2。
除了真正固定长度的列之外,不要使用CHAR
或BINARY
。大部分都很短。此外,大多数CHAR
列应该是CHARACTER SET ascii
,而不是utf8。(想想,country_code
,邮政编码, md5
。(
innodb_log_file_size
仅与您的问题间接相关。它的价值是什么?
与之直接相关的是innodb_page_size
,默认为16K
,实际上没有人会更改。我希望云引擎禁止更改它。
(我和比尔一样,希望获得更多关于你的模式的信息,这样我们就可以更具体地了解如何帮助你。(
您在这里没有太多选择。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 ;
之后,您应该能够创建您的表。