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 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章