Mysql的索引失效(應避免)(十)
https://blog.csdn.net/qq_29347295/article/details/79112102
版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/qq_29347295/article/details/79112102
type:system >const>eq_ref>ref>range>index>all
一般來說:查詢要達到index級別,最好能達到ref
案例1:
create index girl_cup_money on girl(age,cup_size,money);
show index from girl
EXPLAIN select * from girl where age='4';
EXPLAIN select * from girl where age='4' and cup_size='B' ;
EXPLAIN select * from girl where age='4' and cup_size='B' and money='4';
EXPLAIN select * from girl where cup_size='B' ;
EXPLAIN select * from girl where age='4' and money='4';
EXPLAIN select * from girl where cup_size='B' and money='4';
小結論:全值匹配我最愛
最佳左前提法則------如果索引了多列,要遵守最左前法則指的是查詢從索引的最左前列開始並且不跳過索引中的列
3.不在索引列上做任何操作(計算,函式,(自動or手動)型別轉換),都會導致索引失效而轉向全表掃描
如上:索引列沒使用函式,可以用到索引,使用函式不能用到索引
4.儲存引擎不能使用索引中範圍條件右邊的列(注意:範圍條件列可以使用到)
5.儘量使用覆蓋索引(只訪問索引的查詢(索引列和查詢列一致)),減少select *
6.mysql在使用不等於(!=或者<>)的時候無法使用索引會導致全表掃描
7.is null,is not null也無法使用索引
8.like以萬用字元開頭(%abc..)mysql索引實效會變成全表掃描的操作
%abc 和%abc%會變成全表掃描,abc%範圍掃描
解決%abc%時索引不被使用的方法:使用覆蓋索引,即查詢的內容包含在複合索引中
9字串不加單引號索引失效
上面的name=2000發生了隱式的型別轉換,int變成varchar,導致索引失效
10.少用or,用它來連線時會索引失效