無法命中索引的幾種情況

2021-10-24 12:48:05 字數 1308 閱讀 8601

資料庫表中新增索引後確實會讓查詢速度起飛,但前提必須是正確的使用索引來查詢,如果以錯誤的方式使用,則即使建立索引也會不奏效。

1. like '%xx'  

select * from tb1 where name like='%cn';

2. 使用函式

select * from tb1 where reverse(name) = 'giao';

3. or

select * from tb1 where nid = 1 or email = '[email protected]';

--特別的:當or條件中有未建立索引的列才失效

--以下會走索引

select * from tb1 where nid = 1 or name = 'seven'; --nid和name都是索引

select * from tb1 where nid = 1 or email = '[email protected]' and name= 'alex'

--nid和name是索引,email不是,也會走索引

4. 型別不一致

如果列是字串型別,傳入的條件是必須是字串,不然無法命中索引

select * from tb1 where name = 999; --這裡傳的條件是整型,無法命中索引

5. !=

select * from tb1 where name != 'alex'

--特別的:如果是主鍵,則還是會走索引

select * from tb1 where nid != 123

6. >

select * from tb1 where name > 'alex'

--特別的:如果是主鍵或索引是整數型別,則還是會走索引

select * from tb1 where nid > 123

select * from tb1 where num > 123

7.order by

select email from tb1 order by name desc ;

--當根據索引排序時候,選擇的對映如果不是索引,則不走索引

--特別的:如果對主鍵排序,則還是走索引:select * from tb1 order by nid desc;

8.組合索引最左字首

如果組合索引為:(name,email)

name and email -- 使用索引

name` -- 使用索引

條件只有email -- 不使用索引

索引無效的幾種情況

檢查被索引的列或組合索引的首列是否出現在pl sql語句的where子句中,這是 執行計畫 能用到相關索引的必要條件。看採用了哪種型別的連線方式。oracle的共有sort merge join smj hash join hj 和nested loop join nl 在兩張表連線,且內錶的目標列...

索引失效的幾種情況

使用explain sql 可檢視mysql執行計畫 type為掃瞄型別,key為使用索引型別 1.使用了or 除非or的列都加上了索引 2.聯合索引 未符合索引字段順序 3.like查詢 使用前 不走索引 4.字元型不加引號 資料庫自動轉換成數值型 資料型別不統一 不走索引 5.sql中使用函式,...

索引失效的幾種情況

1.有or必全有索引 2.復合索引未用左列字段 3.like以 開頭 4.需要型別轉換 5.where中索引列有運算 6.where中索引列使用了函式 not in 或 not exists 7.如果mysql覺得全表掃瞄更快時 資料少 1.唯一性差 2.頻繁更新的字段不用 更新索引消耗 3.whe...