MySQL 索引失效-模糊查詢,最左匹配原則,OR條件等。( 三 )

然后我再用下面這條查詢語句,這時候就會走索引了 。

MySQL 索引失效-模糊查詢,最左匹配原則,OR條件等。

文章插圖
對索引進行表達式計算在查詢條件中對索引進行表達式計算,也是無法走索引的 。
比如,下面這條查詢語句,執行計劃中 type = ALL,說明是通過全表掃描的方式查詢數據的:
explain select * from t_user where id + 1 = 10;
MySQL 索引失效-模糊查詢,最左匹配原則,OR條件等。

文章插圖
但是,如果把查詢語句的條件改成 where id= 10 - 1,這樣就不是在索引字段進行表達式計算了,于是就可以走索引查詢了 。
MySQL 索引失效-模糊查詢,最左匹配原則,OR條件等。

文章插圖
為什么對索引進行表達式計算,就無法走索引了呢?
原因跟對索引使用函數差不多 。
因為索引保存的是索引字段的原始值,而不是 id + 1 表達式計算后的值 , 所以無法走索引,只能通過把索引字段的取值都取出來,然后依次進行表達式的計算來進行條件判斷,因此采用的就是全表掃描的方式 。
有的同學可能會說,這種對索引進行簡單的表達式計算,在代碼特殊處理下,應該是可以做到索引掃描的 , 比方將id + 1 = 10 變成 id= 10 - 1 。
是的 , 是能夠實現 , 但是 MySQL 還是偷了這個懶,沒有實現 。
我的想法是,可能也是因為 , 表達式計算的情況多種多樣,每種都要考慮的話,代碼可能會很臃腫,所以干脆將這種索引失效的場景告訴程序員,讓程序員自己保證在查詢條件中不要對索引進行表達式計算 。
對索引隱式類型轉換如果索引字段是字符串類型,但是在條件查詢中,輸入的參數是整型的話,你會在執行計劃的結果發現這條語句會走全表掃描 。
我在原本的 t_user 表增加了 phone 字段,是二級索引且類型是 varchar 。
然后我在條件查詢中,用整型作為輸入參數,此時執行計劃中 type = ALL,所以是通過全表掃描來查詢數據的 。
select * from t_user where phone = 1300000001;但是如果索引字段是整型類型,查詢條件中的輸入參數即使字符串,是不會導致索引失效,還是可以走索引掃描 。
我們再看第二個例子 , id 是整型,但是下面這條語句還是走了索引掃描的 。
explain select * from t_user where id = '1';
MySQL 索引失效-模糊查詢,最左匹配原則,OR條件等。

文章插圖
為什么第一個例子會導致索引失效,而第二例子不會呢?
要明白這個原因,首先我們要知道 MySQL 的數據類型轉換規則是什么?就是看 MySQL 是會將字符串轉成數字處理,還是將數字轉換成字符串處理 。
我在看《mysql45講的時候》看到一個簡單的測試方式,就是通過 select “10” > 9 的結果來知道MySQL 的數據類型轉換規則是什么:
  • 如果規則是 MySQL 會將自動「字符串」轉換成「數字」,就相當于 select 10 > 9,這個就是數字比較,所以結果應該是 1;
  • 如果規則是 MySQL 會將自動「數字」轉換成「字符串」,就相當于 select "10" > "9",這個是字符串比較,字符串比較大小是逐位從高位到低位逐個比較(按ascii碼),那么"10"字符串相當于 “1”和“0”字符的組合,所以先是拿 “1” 字符和 “9” 字符比較,因為 “1” 字符比 “9” 字符??,所以结果应该?0 。
在 MySQL 中,執行的結果如下圖:
MySQL 索引失效-模糊查詢,最左匹配原則,OR條件等。

文章插圖
上面的結果為 1,說明 MySQL 在遇到字符串和數字比較的時候,會自動把字符串轉為數字,然后再進行比較 。
前面的例子一中的查詢語句 , 我也跟大家說了是會走全表掃描:
//例子一的查詢語句select * from t_user where phone = 1300000001;這是因為 phone 字段為字符串 , 所以 MySQL 要會自動把字符串轉為數字,所以這條語句相當于:
select * from t_user where CAST(phone AS signed int) = 1300000001;可以看到,CAST 函數是作用在了 phone 字段,而 phone 字段是索引 , 也就是對索引使用了函數!而前面我們也說了,對索引使用函數是會導致索引失效的 。
例子二中的查詢語句,我跟大家說了是會走索引掃描:
//例子二的查詢語句select * from t_user where id = "1";這時因為字符串部分是輸入參數,也就需要將字符串轉為數字 , 所以這條語句相當于:

推薦閱讀