客户反馈创建索引报错,尝试复现
1.复现问题
************************** 1. row ***************************
Table: cc
Create Table: CREATE TABLE `cc` (
`id` int(11) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
KEY `name_index` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
1 row in set (0.10 sec)
mysql> create index namecc_index on cc(name);
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
复制
2 查找原因:
索引 namecc_index 的长度 4*255>767
是由参数innodb_large_prefix 控制
此参数控制索引前缀长度的,不开启最长的长度是 765byte,开启最长3072byte,一般出现此报错的数据库版本是小于MYSQL5.7,同时不同的版本开启的方式也略有不同
3. 修改方式
1. 在5.6的修改方式:
设置变量所有实例都需要执行(否则从库重放报错)
1.1
set global innodb_file_format=Barracuda ;
set global innodb_file_format_max=Barracuda ;
set global innodb_large_prefix=1 ;
复制
1.2 在主库修改 row_format 的格式
alter table t1 row_format=dynamic;
复制
或者 在创建表指定
create table uu (id int,name varchar(255)) row_format=dynamic;
复制
2. 在5.7 版本创建不会报错,因为
innodb_large_prefix-=1 默认值 1
innodb_default_row_format=dynamic 默认是dynamic
innodb_file_format=Barracuda 默认值 Barracuda
需要调整的参数的默认值符合要求
3. 在8.0版本 此参数废弃,默认的行格式最长3072 byte
总结:
一般在MySQL 5.7版本不会遇到此问题,只有在MySQL 5.6版本会遇到此问题,建议MySQL 5.6 升级到MySQL 5.7,比较MySQL 5.6 修改比较麻烦
参考链接
https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_large_prefix
https://dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html#sysvar_innodb_large_prefix
https://dev.mysql.com/doc/refman/8.0/en/added-deprecated-removed.html