mysql in 不走索引的思考


最近开发提出一个疑问,mysql 5.6版本中 in 并没有走索引。SQL 如下格式:

 select  a, b , c, d  from  T  where  b  in ( x1, x2,x3)  

反应思路:

1 . analyze table一下
2 . 分析 in里面值的类型,和 b列这列的定义类型是否一致。
3 . 查看执行计划。
4 . in 其实等同于 or
5 . 如果硬要走索引可以按照如下写法:

select  a, b , c, d  from  T  where  b =‘x1'
union
select  a, b , c, d  from  T  where  b =‘x2'
union
select  a, b , c, d  from  T  where  b =‘x3'

结果走索引了,但是跟不走索引的消耗时间差不多。

6 . 跟开发询问 b列数据的差异性,结果差异性不大。至此,不走索引的原因大概明白了。
那列的唯一性不大,即使有索引,in后面的值超过一定个数后,就会分析消耗,最后判断不如走全表扫描。

PS: mysql 做两列关联时候,索引的匹配的类型如下:

const > eq_reg > ref > range > index  > ALL 
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告