哪些操作會導致索引失效

2022-10-11 07:33:12 字數 1942 閱讀 7641

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

由於表的字段tu_mdn定義為varchar2(20),但在查詢時把該字段作為number型別以where條件傳給oracle,這樣會導致索引失效.

錯誤的例子:select * from test where tu_mdn=13333333333;

正確的例子:select * from test where tu_mdn=『13333333333』;

2. 對索引列進行運算導致索引失效,我所指的對索引列進行運算包括(+,-,*,/,! 等)

錯誤的例子:select * from test where id-1=9;

正確的例子:select * from test where id=10;

3. 使用oracle內部函式導致索引失效.對於這樣情況應當建立基於函式的索引.

錯誤的例子:select * from test where round(id)=10; 說明,此時id的索引已經不起作用了

4. 以下使用會使索引失效,應避免使用;

a. 使用 <> 、not in 、not exist、!=

b. like 「%_」 百分號在前(可採用在建立索引時用reverse(columnname)這種方法處理)

c. 單獨引用復合索引裡非第一位置的索引列.應總是使用索引的第乙個列,如果索引是建立在多個列上, 只有在它的第乙個列被where子句引用時,優化器才會選擇使用該索引。

d. 字元型字段為數字時在where條件裡不新增引號.

e. 當變數採用的是times變數,而表的字段採用的是date變數時.或相反情況。

5. 不要將空的變數值直接與比較運算子(符號)比較。

如果變數可能為空,應使用 is null 或 is not null 進行比較,或者使用 isnull 函式。

6. 不要在 sql **中使用雙引號。

因為字元常量使用單引號。如果沒有必要限定物件名稱,可以使用(非 ansi sql 標準)括號將名稱括起來。

索引使用原則:

在根據執行計畫對sql進行分析之後,逐步的去優化每個子查詢的索引及成本使用情況,執行計畫我的理解就是用來對索引進行逐步的優化的乙個過程,讓每個查詢都盡量使用索引,在索引過程中,索引會經常性失效。

口訣

全值匹配我最愛,最左字首要遵守

帶頭大哥不能死,中間兄弟不能斷

索引列上少計算,範圍之後全失效

like符號寫最右,覆蓋索引不寫星

不等空值還有or,索引失效要少用

var引號不能丟,sql高階也不難

分組之前必排序,一定要上索引啊

建索引注意事項

1、單值索引,盡量選擇過濾性更好的字段,例如:性別字段,過濾度為50%,識別率很差,不建議建索引

2、組合索引,索引欄位的順序可以按照識別度進行排序,識別度越高,放在越靠前

3、組合索引,盡量包含where語句中的更多字段

4、盡可能的根據分析執行計畫、統計資訊,去調整query的寫法達到合適索引的目的

索引容易失效的幾個注意點

1、不在索引列上做任何的操作(計算、函式、型別轉換),會導致索引失效而轉向全表掃瞄

2、組合索引中,如果中間某個字段使用了範圍條件,則右邊的列索引失效

3、盡量使用覆蓋索引(索引列和查詢列一致),減少使用select *

4、mysql在使用不等於(!= 或者<>)的時候,無法使用索引列會導致全表掃瞄

5、is null ,is not null 也無法使用索引

6、like萬用字元必須放在索引列的右邊,否則索引失效,程式設計全表掃瞄

7、字串不加單引號索引失效

8、少用or,用它連線索引會失效

MYSQL中哪些情況會導致索引失效

1.以 開頭的like查詢 優化方案 首先掃瞄二級索引獲取滿足條件的primary key,在根據主鍵回表查詢。select from select actor id from actor where last name like ni tmp inner join actor a on a.act...

會導致索引失效語句

1 使用like關鍵字模糊查詢時,放在前面索引不起作用,只有 不在第乙個位置,索引才會生效 like 文 索引不起作用 2 使用聯合索引時,只有查詢條件中使用了這些欄位中的第乙個字段,索引才會生效 3 使用or關鍵字的查詢,查詢語句的查詢條件中只有or關鍵字,且or前後的兩個條件中的列都是索引時,索...

mysql null會導致索引失效嗎

網上很多部落格中都寫到 is null is not null 無法使用索引 首先說下,該結論經過驗證是錯誤的。現在通過例項來驗證下 我的myslq版本是 5.7.28 建表語句 create table t union index id bigint 20 not null auto increm...