天天看点

记一次索引过长的问题

问题描述:使用esjob  的数据库自动记录job运行情况,表和记录都有esJob  自动创建和插入数据。在测试和本地环境均没有问题:生产爆出如下异常:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Specified key was too long; max key length is 767 bytes

解决: 异常信息表明索引过长,查看表上建立索引的字段.

  • show index from tableName; 查看索引的每个字段的长度。索引类型:normal  普通索引,unique :唯一索引:FULLTEXT:全文索引,SPATIAL:空间索引。 InnoDB:引擎只支持normal  unique  两种索引类型
  • mysql  单列索引的最大长度是767 bytes,utf-8  编码最大支持列的长度为255,即varchar(255);
  • 如果列编码改为utf8mb4, 则单列的最大长度为191,超过则会报异常。

解决:0、编码改为utf-8,字段长度不超过255.

  • 1、修改数据库相关参数:
  • show variables like '%innodb_large_prefix%' 查看是否打开
  • set global innodb_large_prefix=on;
  • show variables like '%innodb_file_format%';
  • 记一次索引过长的问题
  • innodb_file_format  改为Barracuda;
  • set  global innodb_file_format=Barracuda;
  • set global innodb_file_format_max=Barracuda;
  • 打开之后索引的最大长度为 3072 bytes
  • 2.将索引改为前缀索引。
  • 参考:https://dev.mysql.com/doc/refman/5.5/en/innodb-restrictions.html

继续阅读