Mysql索引长度问题
2017-05-11 本文已影响1342人
三斤牛肉
今天在做测试的时候,遇到一个问题,百撕不得其姐。
先描述下场景,本想测试索引使用情况:
explain select sm_id from TB_USER
这里sm_id是唯一索引,确实用了Using index
可是。。。
explain select phone from TB_USER
这里phone是普通索引(不唯一),却走了全表扫描。
image.png这让哥哥非常的不淡定了啊,怎么和理论的不一样呢,理论上有覆盖索引的情况,不会回表了,如sm_id一样。难道书上是骗人的?世界观要崩塌了?
想把phone也改成unique的试试,可是
image.png
字段太长了,那就改短一点呗。
改完后,重新跑explain竟然生效了
image.png
那就是phone字段长度的关系咯
我们来回忆下关于索引长度的理论,Mysql Innodb中单列索引最大长度767bytes也就是255字符,当然可以修改,不过我们这里都是用的默认配置。unique索引超过长度会失败,那non-unique的呢
我们看建表语句
自动截取了前255个字符。
这样我们就可以理解为什么在建唯一索引的时候会失败,而建普通索引不受这个限制。因为截断后(255)是有可能重复的。
这也可以解释为什么截断后查询语句会回表了,因为索引树上存的是(255)自然要回表获取正常值。
总结下:
1,Mysql Innodb默认单列索引最大长度767bytes,一般我们认为是255字符。
2,当索引字段长度超过时,1)如果是unique的会提示失败。2)如果是非唯一的,会自动截取前255位作为索引键。