1. 程式人生 > 資料庫 >MySQL索引失效的幾種情況詳析

MySQL索引失效的幾種情況詳析

1.前導模糊查詢不能利用索引(like '%XX'或者like '%XX%')

假如有這樣一列code的值為'AAA','AAB','BAA','BAB',如果where code like '%AB'條件,由於前面是

模糊的,所以不能利用索引的順序,必須一個個去找,看是否滿足條件。這樣會導致全索引掃描或者全表掃

描。如果是這樣的條件where code like 'A % ',就可以查詢CODE中A開頭的CODE的位置,當碰到B開頭的

資料時,就可以停止查找了,因為後面的資料一定不滿足要求。這樣就可以利用索引了。

2.如果是組合索引的話,如果不按照索引的順序進行查詢,比如直接使用第三個位置上的索引而忽略第一二個位置上的索引時,則會進行全表查詢

索引為c1,c2,c3,c4

MySQL索引失效的幾種情況詳析

上圖結果顯示直接使用c3是全表查詢,無法使用該索引的,所以c3欄位使用索引的前提是c1,c2兩欄位均使用了索引。

3.條件中有or

應儘量避免在 where 子句中使用 or 來連線條件,否則將導致引擎放棄使用索引而進行全表掃描,如:

select id from t where num=10 or num=20

可以這樣查詢:

select id from t where num=10 union all select id from t where num=20

4.索引無法儲存null值,所以where的判斷條件如果對欄位進行了null值判斷,將導致資料庫放棄索引而進行全表查詢,如

select id from t where num is null

可以在num上設定預設值0,確保表中num列沒有null值,然後這樣查詢:

select id from t where num=0

a.單列索引無法儲null值,複合索引無法儲全為null的值。

b.查詢時,採用is null條件時,不能利用到索引,只能全表掃描。

為什麼索引列無法儲存Null值?

a.索引是有序的。NULL值進入索引時,無法確定其應該放在哪裡。(將索引列值進行建樹,其中必然涉及到諸多的比較操作,null 值是不確定值無法比較,無法確定null出現在索引樹的葉子節點位置。)

5.應儘量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。

6.in 和 not in 也要慎用,否則會導致全表掃描,如:

select id from t where num in(1,2,3)

對於連續的數值,能用 between 就不要用 in 了:

select id from t where num between 1 and 3

7. 應儘量避免在where子句中對欄位進行函式操作,這將導致引擎放棄使用索引而進行全表掃描。如:

–name以abc開頭的id

select id from t where substring(name,1,3)='abc'

8.應儘量避免在 where 子句中對欄位進行表示式操作,這將導致引擎放棄使用索引而進行全表掃描。如:

select id from t where num/2=100

應改為:

select id from t where num=100*2

總結

到此這篇關於MySQL索引失效的幾種情況的文章就介紹到這了,更多相關MySQL索引失效內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!