最近开发提出一个疑问,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
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。