如何阻止MySQL导入mysqldump导出结构时自动为外键创建冗余索引
问题根因
- 你现有的联合唯一索引
userId_metaKey中,userId字段配置了*降序(DESC)*排序规则,InnoDB创建外键时默认要求外键列存在匹配排序方向的前缀索引,多数版本的MySQL无法识别降序排列的联合索引前缀可满足外键的索引要求,因此会自动创建额外的升序普通索引。 - mysqldump默认导出的SQL执行顺序是先定义外键约束、再创建自定义索引,导致创建外键时系统无法检测到后续要生成的唯一索引,因此触发自动补索引的逻辑。
解决方案
方案1:调整索引排序规则(最推荐)
绝大多数业务场景下
userId使用降序索引没有实际收益,你可以直接把唯一索引的排序规则修改为默认升序:UNIQUE KEY `userId_metaKey` (`userId`,`metaKey`)修改后该联合索引的最左列就是升序的
userId,完全符合外键的索引要求,后续导出导入都不会再生成冗余索引。方案2:导入时临时关闭外键检查
如果确实需要保留
userId的降序排序规则,可以调整导出的SQL文件,导入时先关闭外键检查,等所有索引创建完成后再开启约束校验:- 打开mysqldump导出的
exports.sql文件,在文件最开头添加一行:
SET foreign_key_checks = 0;- 在文件最末尾添加一行:
SET foreign_key_checks = 1;调整完成后再执行
mysql -u user -p db < exports.sql导入,就不会自动生成冗余索引。- 打开mysqldump导出的
方案3:导入完成后手动清理冗余索引
如果已经完成导入操作,你可以直接手动删除自动生成的冗余索引,完全不会影响外键的正常使用:
ALTER TABLE `usersMeta` DROP INDEX `fk_usersMeta_userId`;
内容的提问来源于stack exchange,提问作者Leo Jiang
相关产品推荐
相关产品推荐

