MySQL: 索引失效的幾種狀況

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

  假若有這樣一列code的值爲'AAA','AAB','BAA','BAB' ,若是where code like '%AB'條件,因爲前面是函數

模糊的,因此不能利用索引的順序,必須一個個去找,看是否知足條件。這樣會致使全索引掃描或者全表掃spa

描。若是是這樣的條件where code like 'A % ',就能夠查找CODE中A開頭的CODE的位置,當碰到B開頭的3d

數據時,就能夠中止查找了,由於後面的數據必定不知足要求。這樣就能夠利用索引了。code

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

索引爲c1,c2,c3,c4索引

上圖結果顯示直接使用c3是全表查詢,沒法使用該索引的,因此c3字段使用索引的前提是c1,c2兩字段均使用了索引。rem

3.條件中有orstring

應儘可能避免在 where 子句中使用 or 來鏈接條件,不然將致使引擎放棄使用索引而進行全表掃描,如:it

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
相關文章
相關標籤/搜索