[MySQL] 索引超出限制,導致#1071 - Specified key was too long; max key length is 767 bytes
阿新 • • 發佈:2018-11-09
錯誤復現
建立如下一張表:
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));