问题背景
今天在Mysql建表的过程中,遇到了一个这样的问题,错误信息 1071 - Specified key was too long; max key length is 767 bytes
下面来分析如何处理
问题分析处理
根据错误提示来看是说主键key长度太长,超过了767字节。分析主键字段PRIMARY KEY (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`)以及utf8mb4最大支持4个字节长度,那么这三个字段相加*3的长度远超767字节就会出现这个问题。那么对于问题的处理就是增大索引长度限制。
先查询一下当前的数据库版本
SHOW variables like 'version';
在查询一下数据库参数innodb_large_prefix是否是关闭状态,5.6版本默认是关闭,5.7以后默认是开启的
SHOW variables like 'innodb_large_prefix';
在查询一下数据库的引擎文件格式innodb_file_format
SHOW variables like 'innodb_file_format';
InnoDB支持两种文件格式 Antelope和Barracuda:
Antelope :是5.6之前的文件格式,支持InnoDB表的COMPACT和REDUNDANT行格式,共享表空间默认为Antelope
Barracuda:是最新的文件格式,支持所有innodb行格式,包括最新的COMPRESSED和DYNAMIC行格式。
以下是ROW_FORMAT的值
如果开启innodb_large_prefix,且Innodb表的存储格式为 DYNAMIC 或 COMPRESSED,则前缀索引最多可包含3072个字节,前缀索引也同样适用。对于上面的索引问题(120+200+200)*4=2080 < 3072,那么就可以创建索引成功,因此需要先开启前缀索引,执行命令如下
SET GLOBAL INNODB_LARGE_PREFIX = ON;
开启后执行查询命令可以看到开启成功
这时再给建表语句加上ROW_FORMAT = Dynamic尝试,可以看到表就可以创建成功了
那么到这里,关于Specified key was too long; max key length is 767 bytes的问题就处理完了。