背景
最近在给一张业务表添加索引的时候(不指定索引长度),最后生成的表,索引长度191
KEY `tel` (`tel`(191)) USING BTREE
对应查看表结构,tel字段长度255
`tel` varchar(255) NOT NULL DEFAULT '' COMMENT '联系手机号',
将tel的长度修改为11
`tel` varchar(11) NOT NULL DEFAULT '' COMMENT '联系手机号',
...
...
...
KEY `tel` (`tel`) USING BTREE
问题原因
以MySQL的varchar、char等字符串类型字段作为索引时,单个索引字段存储长度超过了767字节。
问题剖析
以InnoDB为引擎的MySQL建立索引时,单个最大索引字段存储长度为767。不同字符集的最大单个索引字段存储长度不同。因此,需要根据不同字符集修改对应字符串类型字段的前缀索引长度。以下是不同字符集定义前缀索引长度的方法。
-
UTF-8MB4
按照表为UTF-8MB4字符集的标准,单个字符需要4个字节进行存储,则最大定义索引前缀需设置为191,具体计算方法如下。
767/4=191
-
UTF-8
按照表为UTF-8字符集的标准,单个字符需要3个字节进行存储,则最大定义索引前缀需设置为255,具体计算方法如下。
767/3=255
-
GBK
按照表为GBK字符集的标准,单个字符需要2个字节进行存储,则最大定义索引前缀需设置为383,具体计算方法如下。
767/2=383