无法添加字段...行大小...大于最大允许大小
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,那是退步。它会在下一个版本中消失,因此未来的迁移将会受到影响。
我在 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,那是退步。它会在下一个版本中消失,因此未来的迁移将会受到影响。