美文网首页程序猿之路
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索引长度问题

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

  • mysql InnoDB 索引长度问题

    mysql常用字符集 utf8 一个字符3bytes utf8mb4 一个字符4bytes 单列索引长度不能超过7...

  • MySQL中采用类型varchar(20)和varchar(25

    MySQL建立索引时如果没有限制索引的大小,索引长度会默认采用的该字段的长度,也就是说varchar(20)和va...

  • varchar(20)和varchar(255)的空间开销区别

    MySQL建立索引时如果没有限制索引的大小,索引长度会默认采用的该字段的长度,也就是说varchar(20)和va...

  • MySQL索引长度限制

    问题引入 想必不少开发者在工作过程中会听到同事或者在网上看到以下内容: MySQL索引长度不能超过191,需限制为...

  • MySQL索引及查询优化书目录

    MySQL索引的原理之索引目的 MySQL索引的原理之索引原理 MySQL索引的原理之索引的类型 MySQL索引的...

  • mysql 索引长度、区分度和前缀索引

    好的索引 1、查询频繁 2、 区分度高 3、长度小 4、尽量能覆盖常用查询字段 索引长度的重要性 索引长度直接影响...

  • mysql索引问题

    情景:当表中有两条一模一样的数据,我们第一次插入时就保证了数据正确,但是N次插入呢?就2N条了,所有我们要建索引,...

  • 从磁盘I/O角度聊聊Mysql索引

    从磁盘I/O角度聊聊Mysql索引 首先思考下这个问题,为什么添加了索引就能提高mysql的查询效率呢?MySQL...

  • Mysql前缀索引长度确定方法

    MySQL 前缀索引能有效减小索引文件的大小,提高索引的速度。但是前缀索引也有它的坏处:MySQL 不能在 ORD...

网友评论

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

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