为了账号安全,请及时绑定邮箱和手机立即绑定

mysql索引失效的问题

mysql索引失效的问题

慕粉4241372 2017-06-17 10:54:13
如图,这是一个含3个列的复合索引,使用到1.2.3个列的key_len分别是74、78、140图中最后一条搜索中,由于中间列使用了范围搜索,导致后面的索引失效,key_len是78,也就是最后一个列的索引没用上。但我的问题是,为什么ref显示的是NULL? 既然有一个列生效,那应该显示一个const不是吗?
查看完整描述

1 回答

?
刘先森的猫

TA贡献7条经验 获得超8个赞

这是一个好问题.

在第四次的explain sql时,注意看一个与前三次不同的细节.

如图,我用蓝色标出来的部分.

//img1.sycdn.imooc.com//594a203e000163af12270124.jpg

type这一列,从ref变成了range.

先来回顾下type的作用.

    它显示了连接使用了哪种类别,有无使用索引.

    从最好到最差的连接类型为: const > eq_reg > ref > range > indexhe > ALL

再来看看ref这一列的作用.

    它显示使用哪个列或常数与key一起从表中选择行。 

在第一条到第三条sql时,Mysql查询优化器在比较 ref & range 的代价的时候,ref 的代价更小,所以选择的是ref.

在第四条sql时,ref 与 range 使用的是相同的索引,ref key 的使用的长度小于 range 的长度,则优先使用 range。


另外:

索引并没有失效,第四条sql依然使用到了复合索引.







查看完整回答
2 反对 回复 2017-06-21
  • 1 回答
  • 1 关注
  • 1301 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信