mysql高階(二)——索引實戰
上述就是mysql索引失效的各種原因,下面我們來實戰
表資料:
ALTER TABLE tb_user ADD INDEX idx_user_nap(NAME,age,pos)
;//建立複合索引
最佳做字首法則
前面我們建立了(name,age,pos)的複合索引
可以看出這三種都用到了索引,索引條件越多,越精確,key_len越大
得出結論組合索引缺少前面的時候,不生效
只有name索引生效,pos不生效,原因:複合索引是有順序的(name,age,pos)中間缺少了age那麼pos也會失效。
結論:如果索引了多列,要遵循最左字首法則,查詢從索引的最左前列開始並且不挑鍋索引中的列
不要在索引列上進行計算以及型別轉換
我們插入一條name=‘2000’的資料
正常查詢type是ref級別
對索引欄位進行左擷取操作導致索引失效
大家都知道name的型別是varchar,當我們sql語句中的2000不加引號的時候,mysql也能查詢出來,會幫我們完成自動轉換,但是導致索引失效
範圍之後全失效
由於age使用了範圍查詢,導致type變成range並且根據key_len=66可以知道:只有name、age起到了索引的效果,pos失效
儘量使用覆蓋索引
覆蓋索引就是:之訪問索引的查詢,索引列和查詢欄位一直,減少select *操作
使用!=或者<>會導致全表掃描
結論:導致全表掃描,索引失效
is null 和 is not null無法使用索引
有like的%要加在右邊、
上面兩個都會導致全表掃描,索引失效
%寫在右邊,索引生效,並且是range型別的查詢。
如果業務中必須使用左右兩個%,請使用覆蓋索引來代替select * 如下:
當加入了非索引的查詢欄位就會導致索引失效,如下:
建議:儘量查詢有索引的欄位,避免select *的出現
少用or,會導致索引失效
總結:
全值匹配我最愛,最左字首要遵守;
帶頭大哥不能死,中間兄弟不能斷;
索引列上少計算,範圍之後全失效;
LIKE百分寫最右,覆蓋索引不寫星;
不等空值還有or,索引失效要少用;
VAR引號不可丟,SQL高階也不難!