mysql索引失效的情況及使用

.索引失效的幾種情況

  1.如果條件中有or,即使其中有條件帶索引也不會使用(這也是爲什麼儘量少用or的原因)

  要想使用or,又想讓索引生效,只能將or條件中的每個列都加上索引

  2.對於多列索引,不是使用的第一部分,則不會使用索引(靠左原則)

  3.like查詢以%開頭的列索引會失效

  4.如果列類型是字符串,那一定要在條件中將數據使用引號引用起來,否則不使用索引

  5.如果mysql估計使用全表掃描要比使用索引快,則不使用索引

       6 不等於(!= ,<> ),EXISTS,not in,is  not null,>,<都會失效,in(in裏面包含了子查詢)(非主鍵索引)

下面對這幾種情況進行測試

例如有個表 test  有 id,name,age三個字段

首先插入10000條

INSERT INTO test(id,name,age) 

 VALUES

('5','5test','5'),('6','6test','6'),('7','7test','7'),......('9999','9999test','9999');

上面是一種批量插入的方法,可以減少數據連接的次數,有興趣的可以試試,這個我沒在代碼(xml)裏面試過

數據已經有了

使用id作爲索引

ALTER TABLE testADD index_id(`id`);

EXPLAIN select * from test where  id= '26' 

可以看得出來是走了索引的;如果表中數據量不夠大,msyql覺得全盤掃描的時間比走索引的時間短的話可能就不會走索引了

組合索引(靠左原則)

現在增加組合索引

ALTER TABLE testADD name_age (`name`,`age`);

1 根據name精確查詢時

EXPLAIN select * from test where  name = '26test' 
 

可見是走了 name_age索引的: 靠左原則

 

2 根據name+age查詢時(靠左原則)

EXPLAIN select * from test where  name = '26test' and age='26'

EXPLAIN select * from test where age =26 and  name = '26test' 
 

3 使用age查詢時(索引失效的第二種情況)

EXPLAIN select * from test where   age='26'  
 

沒有走name_age索引: 原因是mysql的靠左原則(根據where最最側的匹配是否有索引),所以不使用name_age索引

問題來了:如果這樣的話會使用哪個索引呢?

EXPLAIN select * from test where   name='26' and id='26'

可見possible_keys有兩個索引,但是最後使用的還是 id_index索引,因爲它耗時最少

 

4 組合索引使用 like 時 

EXPLAIN select * from test where age like '%26%' and  name = '26test' 

使用的還是name_age索引,爲什麼呢?  因爲雖然like不會走索引 但是 name 遵循了靠左原則所以還是會使用索引

使用這條時:EXPLAIN select * from test where   name like '%26%' and age='26'

或 EXPLAIN select * from test where  id like '%26%'
索引失效的第三種

結果就是沒有使用索引,因爲name使用的是模糊查詢

 

5 組合索引(失效)+非組合索引

EXPLAIN select * from test where   name like '%26%' and age='26' and id='26'

可見使用的是 id_index

 

6 非組合索引使用like查詢(索引失效的第三種)

EXPLAIN select * from test where  id like '%26%'

 

7 or 條件如果都有所有就會使用索引

一下兩種都會走索引

EXPLAIN select * from test where  id ='26' or name='26test';

EXPLAIN select * from test where  id ='26' or age='26' and name='26test';

因爲id和name(name_index:靠左原則)都有索引所以最後還是走了索引----index_merge 索引合併

 

8 or條件中 其中之一沒有索引就會使索引失效(索引失效的第一種

EXPLAIN select * from test where  id ='26' or age='26';
 

id有索引但是age不是索引,所以就走了全盤掃描

9 字符串沒有加引號(索引失效的第四種

EXPLAIN select * from test where    name=26

覺得文章有幫助的話就讚賞下吧!

 

微信:

支付寶:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章