如何克服Google-Cloud MySQL5.7第二代上的行大小太大(>8126)错误



谷歌云MySQL引擎仅支持InnoDB存储引擎。

在创建一个包含300列的表时,我遇到了以下错误。

[Err]1118-行大小过大(>8126(。

将某些列更改为TEXTBLOB可能会有所帮助。在当前行格式中,0字节的BLOB前缀以内联方式存储。

我尝试创建一个表,其中一些列作为文本类型,另一些列作为blob类型,但没有成功。即使是修改innodb_log_file_size也是不可能的,因为它在Google Cloud SQL平台上是不允许的。

"垂直分区">

一个有很多列的表正在突破几个极限;你打了其中一个。有几种合理的解决方案,垂直分区可能是最好的,尤其是如果许多是TEXT/BLOB

除了一个可以AUTO_INCREMENT之外,使用多个具有相同PRIMARY KEY的表来代替单个表。JOIN根据需要将它们组合在一起以收集列。您甚至可以使用VIEWs来隐藏拆分表的事实。我建议根据应用程序和需要"一起"使用的列进行一些逻辑分组。

不要在列之间显示事物数组;相反,使用另一个具有多行的表来处理重复。示例:address1,state1,country1,address2,state2,country2。

除了真正固定长度的列之外,不要使用CHARBINARY。大部分都很短。此外,大多数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 ;

之后,您应该能够创建您的表。

相关内容

  • 没有找到相关文章

最新更新