美文网首页程序猿之路
Mysql索引长度问题

Mysql索引长度问题

作者: 三斤牛肉 | 来源:发表于2017-05-11 19:18 被阅读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位作为索引键。

    相关文章

      网友评论

        本文标题:Mysql索引长度问题

        本文链接:https://www.haomeiwen.com/subject/qaootxtx.html