mysql in 不走索引的思考

2021-08-13 22:20:05 字數 749 閱讀 8146

最近開發提出乙個疑問,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

不走索引的原因

補充 不走索引的原因,甚至加上hint 還不走索引,那可能是因為你要走索引的這列是nullable,雖然這列沒有空值。將字段改為not null 備註 不走索引的其它原因1 建立組合索引,但查詢謂詞並未使用組合索引的第一列,此處有乙個index skip scan概念。2 在包含有null值的tab...

mysql不走索引總結

在mysql查詢語句中,總會發現明明已經建立了查詢字段索引,可是卻沒有用到,這是因為在mysql中有些查詢語句是用不到索引的,總結如下,以供大家分享。1.like語句 2.列型別為字串型別,查詢時沒有用單引號引起來 3.在where查詢語句中使用表示式 4.在where查詢語句中對字段進行null值...

MySQL not exists 真的不走索引麼

在一些業務場景中,會使用not exists語句確保返回資料不存在於特定集合,部分同事會發現not exists有些場景效能較差,甚至有些網上謠言說 not exists不走索引 哪對於not exists語句,我們如何優化呢?以今天優化的sql為例,優化前sql為 select count 1 f...