MySQL 5.7 索引长度超出限制问题——阿里云 RDS MySQL 踩坑

MySQL 5.7 索引长度超出限制问题——阿里云 RDS MySQL 踩坑

远风 25 2023-06-03

MySQL索引长度超出限制问题——阿里云RDS MySQL踩坑

一次上线后发现 Flyway 迁移脚本报错:

Error 1071: Specified key was too long; max key length is 767 bytes.

或者

ERROR 1709 (HY000): Index column size too large. The maximum column size is 767 bytes.

项目使用的是阿里云RDS MySQL 5.7 , 的确是有 column 的长度设置为了 255 ,同时又对这个 column 加上了索引,同时还使用了utf8mb4字符集,这就导致 255 4 > 767 超出了索引长度的限制,如果使用utf8mb3的话,255 * 3 = 765 < 767 就不会产生这种问题了。

但是本地的 MySQL 5.7 运行迁移时并没有出现这个问题,为什么呢?

原因是 MySQL 5.7 默认参数 innodb_large_prefix 是 ON 开启状态,这种情况下 key 最长 3072 字节,但是阿里云 RDS MySQL 5.7 的默认配置是 OFF,可能是出于性能或者资源优化的原因如此设置,但是阿里云的官方文档里面并没有显式的标注出 阿里云 RDS MySQL 相对于官方社区的 MySQL 默认配置做出的改动,只有实际购买了他的 RDS MySQL 产品之后才能在控制台看到这些参数,笔者觉得这一点欠妥。不过,好在在帮助文档最后一节的常见问题中,单独有一篇讲到这个问题,倒也还算亡羊补牢。

希望阿里云这种规模的公司能够在这种产品上能尽早的给到用户提示,而不是等出了问题再给出解决方案。

当然,从技术的角度来说,作为使用者,使用这样的第三方产品之前,也应该把默认参数确认一遍,这样才能最大可能的避免出现这样的问题。