MariaDB(utf8mb4+InnoDB)导入SQL报ERROR 1071键过长问题求助
问题诱因
- 你反复调整varchar字段长度仍然报错,核心原因是触发长度超限的根本不是你修改的varchar字段:你定义的
search复合索引包含了caption字段,该字段为TEXT类型,建普通B树索引时如果不手动指定前缀长度,会尝试将字段全量内容计入索引长度。 - 当前环境使用
utf8mb4字符集,单字符最多占用4字节,TEXT类型最大支持存储65535字节内容,仅这一个字段的理论索引长度就远超InnoDB规定的3072字节单键上限,和其他varchar字段的长度没有关系。 - 这类问题通常出现在从老版本MySQL/MariaDB(使用utf8 3字节字符集、MyISAM引擎)导出SQL、导入到新环境的场景,新旧环境的索引长度计算规则、引擎限制存在差异。
- 额外提示:你修改后的建表语句存在语法错误,
votes int( DEFAULT '0' NOT NULL处缺少右括号,修复索引问题后也需要修正这个语法问题才能正常建表。
解决方法
你可以根据实际业务需求任选以下一种方案修复:
- 方案1:为长文本字段指定索引前缀长度
给索引里的长字段设置前缀长度,仅索引字段开头的部分字符(前缀长度可以根据你的查询匹配需求调整,只要总索引长度不超过3072字节即可),示例索引定义如下:
按你调整后的varchar字段长度计算,该索引总长度约为(50+100+30+30)*4 = 840字节,远低于3072字节的上限,不会触发长度错误。KEY search (title(50), caption(100), keywords(30), filename(30)) - 方案2:移除索引中不必要的长文本字段
如果不需要通过caption字段做前缀匹配查询,可以直接把caption从search复合索引中移除,仅保留title、keywords、filename这类短字段,索引总长度会更短,完全不会触发长度限制。 - 方案3:长文本搜索改用全文索引
如果你确实需要对caption这类长文本内容做关键词搜索,不要使用普通B树索引,替换为InnoDB支持的FULLTEXT全文索引即可,全文索引不受3072字节的普通索引长度限制,长文本搜索效率也远高于普通前缀索引。
内容的提问来源于stack exchange,提问作者J. Scott Elblein
相关产品推荐
相关产品推荐

