mysql in 不走索引的思考
阿新 • • 發佈:2019-01-29
最近開發提出一個疑問,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