当前位置:   article > 正文

Mysql之Specified key was too long; max key length is xx bytes异常_specified key was too long 3072

specified key was too long 3072

问题原因:mysq索引的字段都太长了

767字节是 MySQL 版本5.6(以及以前版本)中 InnoDB 表的最大索引前缀长度限制,MyISAM 表的长度为1,000字节。在 MySQL 版本5.7及以上版本中,这个限制增加到了3072字节。

如果对 utf8mb4编码的 varchar 字段设置索引,因为utf8mb4编码每个字符占4个字节,所以必须将最大索引前缀长度767字节(或3072字节)除以4,得到191,这是字段的最大字符长度。如果是 utf8 编码,它将是三个字节,最大索引前缀长度为255。

解决办法:让mysql支持比较长的索引,然后在插入表的时候,添加ROW_FORMAT=DYNAMIC ,自动格式化索引。

对于MySQL版本5.6(以及以前版本),如果设置为InnoDB、utf8mb4编码,那么 varchar 类型的字段要想设置索引,则字段长度必须小于等于 191;如果为utf8编码,varchar 字段要想设置索引,字段长度必须小于等于 255

5.7及以上版本中这个数变大了,对于 varchar 类型建立索引一般没有影响了,因为一般我们不会设置太大的varchar类型字段。

出现此类问题的原因都是在于InnoDB 表引擎的限制,默认情况下,索引前缀长度限制为 767 字节,当开启了 innodb_large_prefix 选项时,索引前缀长度扩展到 3072 字节。

show variables like '%innodb_large_prefix%';

除此之外,索引前缀长度还和 InnoDB 的 page size 有关。innodb_page_size 选项默认是 16KB 的时候,最长索引前缀长度是 3072 字节,如果是 8KB 的时候,最长索引前缀长度是 1536 字节,
默认是3KB的时候,是1024字节,默认是4KB 的时候,是 768 字节。

show variables like '%innodb_page_size%';

解决方案:

  1. --修改最大索引长度限制
  2. set global innodb_large_prefix=1;
  3. set global innodb_file_format=BARRACUDA;
  4. -- 添加
  5. set global innodb_file_format_max=BARRACUDA;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/599604
推荐阅读
相关标签
  

闽ICP备14008679号