MYSQL索引失效的各種情況小結

1862021發表於2021-06-04

一、對列使用函式,該列的索引將不起作用

如:substring(欄位名,1,2)='xxx';

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

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

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

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

如:欄位名 LIKE CONCAT('%', '2014 - 08 - 13', '%') ;

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

如:欄位名  < > 2;

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

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

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

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

select * from test where t_number='13333333333'; //正確的寫法;
七、使用not in ,not exist等語句時

八、當變數採用的是times變數,而表的欄位採用的是date變數時.或相反情況

九、當B-tree索引 is null不會失效,使用is not null時,會失效,點陣圖索引 is null,is not null 都會失效。

十、聯合索引 is not null 只要在建立的索引列(不分先後)都會失效

in null時 必須要和建立索引第一列一起使用,當建立索引第一位置條件是is null 時,其他建立索引的列可以是is null(但必須在所有列 都滿足is null的時候),或者 = 一個值;

當建立索引的第一位置是 = 一個值時,其他索引列可以是任何情況(包括is null  = 一個值),以上兩種情況索引都會失效,其他情況不會失效。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69999637/viewspace-2775421/,如需轉載,請註明出處,否則將追究法律責任。

相關文章