无法添加字段...行大小...大于最大允许大小

Cannot add field...row size...greater than maximum allowed size

我在 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 结构吗?这是我需要关心的事情吗?

一些 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

请告诉我们SHOW CREATE TABLE。我敢打赌您声明了很多列 VARCHAR(255)。我还敢打赌,这些列中的大多数永远不需要 255 个字符。缩小它们。

如果还不够,把几个改成TEXT;数据将存储在页外,不会严重影响 8K 限制。

如果这还不够,我们可以谈谈"vertical partitioning"。届时,请向我们展示导致错误的查询。如果您正在做 SELECT *,请将其更改为仅指定您真正需要的列。

不要使用MyISAM,那是退步。它会在下一个版本中消失,因此未来的迁移将会受到影响。