image.png

MyISAM

InnoDB

默认情况下utf编码一个字符占三个字节,也就是说在InnoDB引擎中,4个varchar(255)字段就把单表索引长度给占满了哦!

3072 / 767 约等于 4, 而varchar(255),在utf8编码下是765字节,因此四个varchar(255)字段就快超过综合3072了

MySQL版本对索引长度限制

image.png

MySQL5.5 版本:引入了 innodb_large_prefix,用来禁用大型前缀索引,以便与不支持大索引键前缀的早期版本的 InnoDB 兼容

开启 innodb_large_prefix 可以使单索引的长度限制达到 3072 字节(但是联合索引总长度限制还是 3072 字节),禁用时单索引的长度限制为 767 字节

MySQL5.7: MySQL5.5版本与MySQL5.6 版本,innodb_large_prefix 是默认关闭的,在 MySQL5.7 及以上版本则默认开启

MySQL8.0 版本:innodb_large_prefix 已被移除,从版本 8.0 开始,索引长度限制由行格式决定

若行格式为 DYNAMIC 或 COMPRESSED 时,限制值为 3072,而行格式 REDUNDANT 或 COMPACT 时,限制值为 767。

MySQL在5.7及以上版本在InnoDB引擎中默认行格式是 DYNAMIC,所以限制长度为3072字节。

字符集对索引长度影响

了解完存储引擎和不同MySQL版本对索引长度的限制,我们以InnoDB引擎为例,看MySQL不同的字符集对索引长度有啥影响。

未开启 innodb_large_prefix