程序猿之路

Mysql索引长度问题

2017-05-11  本文已影响1342人  三斤牛肉

今天在做测试的时候,遇到一个问题,百撕不得其姐。
先描述下场景,本想测试索引使用情况:
explain select sm_id from TB_USER

image.png

这里sm_id是唯一索引,确实用了Using index
可是。。。
explain select phone from TB_USER

image.png

这里phone是普通索引(不唯一),却走了全表扫描。

image.png

这让哥哥非常的不淡定了啊,怎么和理论的不一样呢,理论上有覆盖索引的情况,不会回表了,如sm_id一样。难道书上是骗人的?世界观要崩塌了?
想把phone也改成unique的试试,可是


image.png

字段太长了,那就改短一点呗。
改完后,重新跑explain竟然生效了


image.png

那就是phone字段长度的关系咯
我们来回忆下关于索引长度的理论,Mysql Innodb中单列索引最大长度767bytes也就是255字符,当然可以修改,不过我们这里都是用的默认配置。unique索引超过长度会失败,那non-unique的呢
我们看建表语句

image.png

自动截取了前255个字符。

这样我们就可以理解为什么在建唯一索引的时候会失败,而建普通索引不受这个限制。因为截断后(255)是有可能重复的。
这也可以解释为什么截断后查询语句会回表了,因为索引树上存的是
(255)自然要回表获取正常值。


总结下:
1,Mysql Innodb默认单列索引最大长度767bytes,一般我们认为是255字符。
2,当索引字段长度超过时,1)如果是unique的会提示失败。2)如果是非唯一的,会自动截取前255位作为索引键。

上一篇下一篇

猜你喜欢

热点阅读