mysql 索引失效的情況

一  索引自身出問題

1) 索引本身失效

2) 沒有查詢條件,或者查詢條件沒有建立索引 

3) 在查詢條件上沒有使用引導列 
4) 對小表查詢 

5) 查詢的數量是大表中的大部分數據。

二  受查詢條件的影響

5) 對列使用函數,該列的索引將不起作用。

   如:substring(字段名,1,2)='xxx';

6) 對列進行運算(+,-,*,/,! 等),該列的索引將不起作用。

   如:select * from test where id-1=9;//錯誤的寫法

       select * from test where id=10; //正確的寫法 

7) 某些情況下的LIKE操作,該列的索引將不起作用。

   如:字段名 LIKE CONCAT('%', '2014 - 08 - 13', '%') 

8)某些情況使用反向操作,該列的索引將不起作用。

   如:字段名 <> 2

9)在WHERE中使用OR時,有一個列沒有索引,那麼其它列的索引將不起作用 

10)隱式轉換導致索引失效.這一點應當引起重視.也是開發中經常會犯的錯誤. 

     由於表的字段t_number定義爲varchar2(20),但在查詢時把該字段作爲number類型以where條件傳給Oracle,這樣會導致索引失效。

     如: select * from test where t_number=13333333333;  //錯誤的寫法

           select * from test where t_number='13333333333'; //正確的寫法 

11)使用not in ,not exist等語句時
12)當變量採用的是times變量,而表的字段採用的是date變量時.或相反情況。 
13)當B-tree索引 is null不會失效,使用is not null時,會失效,位圖索引 is null,is not null 都會失效。 
14)聯合索引 is not null 只要在建立的索引列(不分先後)都會失效, 

in null時 必須要和建立索引第一列一起使用,當建立索引第一位置條件是is null 時,其他建立索引的列可以是is null(但必須在所有列 都滿足is null的時候),或者 = 一個值;           當建立索引的第一位置是 = 一個值時,其他索引列可以是任何情況(包括is null  = 一個值),以上兩種情況索引都會失效,其他情況不會失效。
 

發佈了202 篇原創文章 · 獲贊 88 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章