RDS MySQL 建索引时 Specified key was too long; max key length is 767 bytes 错误的处理

avatar 2018年5月30日13:15:25 评论 454

在大字段上创建索引时,有时会碰到下面的错误

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

1. 错误原因

由于 MySQL Innodb 引擎表索引字段长度的限制为 767 字节,因此对于多字节字符集的大字段(或者多字段组合索引),创建索引会出现上面的错误。

以 utf8mb4 字符集 字符串类型字段为例:utf8mb4 是 4 字节字符集,则默认支持的索引字段最大长度是: 767 字节 / 4 字节每字符 = 191 字符,因此在 varchar(255) 或 char(255) 类型字段上创建索引会失败。

注:MySQL官网关于 utf8mb4 字符集的参考文档

2. 解决步骤

Step 1. RDS 控制台  参数设置,调整参数 innodb_large_prefix 为 ON

将 Innodb_large_prefix 修改为 on 后,对于 Dynamic 和 Compressed 格式的InnoDB 引擎表,其最大的索引字段长度支持到 3072 字节。

Step 2. 创建表的时候指定表的 row format 格式为 Dynamic 或者 Compressed,如下示例:

create table idx_length_test_02
(
  id int auto_increment primary key,
  name varchar(255)
) 
ROW_FORMAT=DYNAMIC default charset utf8mb4;

 insert into idx_length_test_02 values (null,'xxxxxxxxxx');

 create index idx_name on idx_length_test_02 (name);

show warnings;
show create table idx_length_test_02 \G

Step 3. 修改现有表

对已经创建的表,通过下面的语句修改下表的 row_format 格式

alter table <table_name> row_format=dynamic;
alter table <table_name> row_format=compressed;

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: