資料庫索引失效的情況

2021-10-21 08:46:20 字數 1634 閱讀 3088

1、列與列之間的對比

比如一張表中的兩列(id和c_id)都單獨建立了索引,但是下面這種情況不會走索引           

select * from table where id = c_id; //這種情況會被認為還不如走全表掃瞄

2、存在null值
我們在設計資料庫時盡量避免null值的出現,如果不可避免地要出現null值的情況,也要這是預設值,比如數值型別的可以設定為0或者-1,字串可以設成空字串或者其他的東西。

如果索引列是可空的,是不會給其建立索引的,索引值是小於表的count(*)值的,這種情況下也會去全表掃瞄。

select * from table where id is not null;

3、存在not條件
我們知道建立索引的時候。給每乙個索引建立乙個條目,如果查詢條件為等值查詢或者範圍查詢的時候 ,索引可以根據查詢條件去找對應的條目。但是如果查村條件為非得時候,索引就定位困難了,執行計畫可能更傾向於全表掃瞄,這類查詢條件有:<>、not 、not in 、not exit           

select * from test where id<>500;

select * from test where id in (1,2,3,4,5); //不走索引

select * from test where id in (1); //走索引

select * from test where not in (6,7,8,9,0);

select * from test where not exists (select 1 from test_02 where test_02.id=test.id);

4、like萬用字元
當使用模糊查詢的時候盡量使用後置萬用字元,例如name || '%',前置匹配更傾向於全表掃瞄,而後置匹配可以走index range scan。            

select * from table where name like 張|| '%'

5、條件中有or,索引也會失效

6、條件上包括函式

查詢條件上盡量不要對有索引的列使用函式,例如:            

select * from table where upper(name) == "abc";

因為索引建立的時候會和計算以後的可能不同,無法定位到索引。但是如果查詢條件不對索引列進行計算,那麼依然可以走索引。例如:

select * from table where name = upper("abc"); ---index range scan

7、如果列型別是字串,那一定要在條件中將資料使用引號引用起來(就是查詢的資料和字段的型別保持一致)否則索引失效。

8、如果mysql估計使用全表掃瞄要比使用索引快,則不適用索引。

9、在使用索引字段作為條件時,如果該索引是復合索引,那麼必須使用到該索引中的第乙個字段作為條件時才能保證系統使用該索引,否則該索引將不會被使用,並且應盡可能的讓字段順序與索引順序相一致。查詢字段包含復合索引的字段,且條件和查詢欄位的順序一致。

資料庫索引失效情況

索引失效 1.建立了單字段索引,where條件內多個字段alter table test add index test index name using btree select from test where name test and 02.建立聯合索引,where條件單個字段alter tab...

資料庫索引 索引失效

以下情況不走索引 select from student where name like xiaoyao select from student where not score 100 select from student where score 100 select from student w...

資料庫索引失效

索引失效 1 沒有查詢條件,或者查詢條件沒有建立索引 2 在查詢條件上沒有使用引導列 3 查詢的數量是大表的大部分,應該是30 以上。4 索引本身失效 5 查詢條件使用函式在索引列上 見12 6 對小表查詢 7 提示不使用索引 8 統計資料不真實 9 cbo計算走索引花費過大的情況。其實也包含了上面...