RDS MySQL创建索引时报错Error 1709: Index column size too large. The maximum column size is 767 bytes

问题现象

RDS MySQL中,当尝试在大字段上创建索引时,可能会遇到以下错误:

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

可能原因

MySQLInnoDB引擎对索引字段长度的限制为767字节。对于多字节字符集的大字段或多字段组合,创建索引时会超出此限制就会引发报错。

说明

utf8mb4字符集为例,它是4字节字符集,默认支持的索引字段最大长度为191字符(767字节/每字符4字节≈191字符)。因此,在varchar(255)char(255)类型字段上创建索引会失败。更多详情,请参见MySQL官网文档

解决方案

  1. 登录RDS控制台,在参数设置页面修改参数innodb_large_prefixON,并单击提交参数

    说明

    innodb_large_prefix

  2. 调整表的row_format。

    • 创建新表时,指定表的row_formatDynamicCompressed。示例如下:

      CREATE TABLE idx_length_test_02 (
          id INT AUTO_INCREMENT PRIMARY KEY,
          name VARCHAR(255)
      ) ROW_FORMAT=DYNAMIC DEFAULT CHARSET=utf8mb4;
    • 对于已创建的表,可通过以下命令修改row_format:

      ALTER TABLE <表名> ROW_FORMAT=DYNAMIC;
      ALTER TABLE <表名> ROW_FORMAT=COMPRESSED;

完成上述操作后,请重新尝试创建索引,并检查是否仍出现错误。