MySQL innodb_large_prefix 参数

用户头像
南宫煌
关注
发布于: 2020 年 07 月 27 日



这两天,工作中遇到这么个问题,正好课程讲到数据库,所以总结记录下。

创建数据库表的时候,报错:ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes

信息很明确,就是由于innoDB表的索引长度限制,那么为什么会有这个限制,怎么消除这个限制,当然分析了下。



问题原因

其实,在MySQL5.6版本后引入了参数innodb_large_prefix可以解决这个问题。该参数控制是否允许单列的索引长度超过767字节,有ON和OFF两个取值:

  • ON :Innodb表的行记录格式(row format)是Dynamic或Compressed的前提下,单列索引长度上限扩展到3072个字节,联合索引长度上线仍为3072个字节

  • OFF:Innodb表的单例索引长度最多为767个字节,索引长度超出后,主键索引会创建失败,唯一索引也会创建失败,辅助索引会被截断成为前缀索引



解决方案

使用前缀索引,减少字段索引长度;

设置MySQL的全局参数innodb_large_prefix=ON,将InnoDB表的索引上限扩大到3072个字节。



说明

字段varchar(N)中的N是指字符的长度,不是字节数,需要结合字符集换算得出字节数。例如:utf8字符集一个字符占3个字节,若单列索引限制767,则最大可以支持N=255.而utf8mb4字符集一个字符占4个字节,若单列索引限制767,则最大可以支持N=191。



建议

  • 在数据库迁移和数据库版本升级的过程中,需要对齐源库和目标库的innodb_large_prefix参数取值,否则可能导致建表失败

  • 在设计数据库表结构的过程中,对于一个可能包含很长字符串的列上创建索引时尽量使用前缀索引



用户头像

南宫煌

关注

还未添加个人签名 2019.10.08 加入

还未添加个人简介

评论

发布
暂无评论
MySQL  innodb_large_prefix 参数