1. 程式人生 > >mysql in 不走索引的思考

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