我在MySQL日志中看到以下错误:
[Warning] InnoDB: Cannot add field `wd_field_ft_95_240` in table `tmp`.`#sql_1_0` because after adding it, the row size is 8155 which is greater than maximum allowed size (8126) for a record on index leaf page.
这个tmp
数据库是某种内部MySQL结构吗?这是我需要关心的事情吗?
答案 0 :(得分:6)
某些MySQL查询创建internal temporary tables以保存部分结果。
从MySQL 5.7.6开始,内部临时表的默认存储引擎是InnoDB,它对行大小的限制非常小,如您所见(尽管BLOB / TEXT列可以超出该限制)。
您可以返回旧的5.7之前的默认存储引擎以获取内部临时表:
internal_tmp_disk_storage_engine=MyISAM
这是此错误中提到的解决方法:" Bug #77398 row size too large in mysql 5.7 query"
答案 1 :(得分:0)
请告诉我们SHOW CREATE TABLE
。我打赌你有很多列被宣布为VARCHAR(255)
。我还打赌,大多数这些列永远不会需要255个字符。收缩它们。
如果这还不够,请将少数更改为TEXT
;数据将存储在页外,不会严重影响8K限制。
如果这还不够,我们可以谈论"垂直分区"。那时,请向我们展示导致错误的查询。如果您正在执行SELECT *
,请将其更改为仅指定您真正需要的列。
不要使用MyISAM,这是一个倒退。它将在下一个版本中消失,因此未来的迁移将受到损害。