1. 程式人生 > >mysql高階(二)——索引實戰

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高階也不難!

這裡寫圖片描述