1. 程式人生 > >[MySQL] 索引超出限制,導致#1071 - Specified key was too long; max key length is 767 bytes

[MySQL] 索引超出限制,導致#1071 - Specified key was too long; max key length is 767 bytes

錯誤復現

建立如下一張表:

create table `mytable` (
id bigint primary key not null auto_increment,
column1 varchar(255),
column2 varchar(255)
) engine Innodb charset utf8;

並執行如下的建立複合索引的語句:

alter table `mytable` add unique (`column1`, `column2`);

會得到如下的錯誤:

18:18:51    alter table `mytable` add unique
(`column1`, `column2`) Error Code: 1071. Specified key was too long;
max key length is 767 bytes 0.125 sec

意思是指定的索太張了,超過最大索引大小767B的限制了。

原因

在MySQL 5.6及之前的版本,使用InnoDB作引擎的表的索引大小要小於767B,對於MyISAM的限制則是1000B。在MySQL5.7之後此限制擴充套件到了3027B

如果你設定的一個varchar欄位使用的是utf8mb4字符集,那麼索引最多可以儲存 767 / 4 = 191個這樣的字元。因為utf8mb4的字元每個佔4B的儲存空間,如果varchar使用utf8字符集,那麼索引最多可以儲存767 / 3 = 254個這樣的字元。因為使用utf8儲存的字元佔3B的儲存空間

解決辦法

減少索引列的長度

alter table `mytable` change column column1 column1 varchar(20), change column column2 column2 varchar(20);

擷取列的一部分作為索引,而不是全部

alter table `mytable` add unique (`column1`(15), `column2`(15));

參考連結

https://stackoverflow.com/questions/1814532/1071-specified-key-was-too-long-max-key-length-is-767-bytes