1. 程式人生 > >MySQL索引的使用及註意事項

MySQL索引的使用及註意事項

all mysql索引 size 讀取 plain 使用 查找 數量級 至少

索引是存儲引擎用於快速找到記錄的一種數據結構。索引優化應該是對查詢性能優化最有效的手段了。索引能夠輕易將查詢性能提高幾個數量級,"最優"的索引有時比一個"好的"索引性能要好兩個數量級。

索引可以包含一個(單列索引)或多個列(組合索引)的值。

想要使用組合索引首先要了解一個原則:最左前綴原則。如果索引包含多個列,那麽列的順序十分重要,因為 MySQL 只能高效地使用索引的最左前綴列

最左前綴原則:

比如我們創建一個(A,B,C)組合索引,也就相當與創建了(A),(A,B),(A,B,C)三個索引。

這裏需要註意的一點是,在滿足最左前綴的原則下,索引字段的使用和順序無關

如:select * from test where B = ‘1‘ and A = ‘2‘;

上述語句也使用了索引,使用了(A,B)索引。

但是:select * from test where C = ‘1‘ and B = ‘2‘;

上述語句不能使用索引,不滿足最左前綴原則。如果後面再加上 and A = ‘3‘ 則可以使用索引。

使用索引時需要註意的地方:

  • 首先要滿足最左前綴原則 ,如果不是按照索引的最左列開始查找,則無法使用索引。

  • 不能跳過索引中的列。例如:where A = ‘1‘ and C = ‘3‘;在這當中,只有 A 能使用索引,C 不能使用索引。

  • MySQL 能在索引中做最左前綴匹配的 like 比較,但是如果是通配符開頭的 like 比較,就不能使用索引

    。例如:like ‘name%‘ 可以使用索引,like ‘%name‘ 則不能使用索引。

  • 如果查詢中有某個列的範圍查詢,則其右邊所有列都無法使用索引優化查找。例如:where A = ‘name‘ and B like ‘name%‘ and C = ‘name‘; 這裏只有 A,B 能使用索引,C不能使用索引。

  • where 條件中包含表達式或函數的參數不能使用索引。例如 where A + 1 = 2; 使用了表達式,不能使用索引。

  • "把 where 條件裏面的列都建上索引"。這類說法是錯誤的。

  • 將選擇性最高的列放在索引最前列。

  • order by 子句和查找型查詢的限制是一樣的,需要滿足索引的最左前綴的要求。

EXPLAIN 命令:

技術分享圖片

EXPLAIN 語句輸出結果的各個行的解釋如下:

id:select 識別符,這是 select 查詢序列號。

select_type: 表示查詢中 select 類型,簡單或復雜。

table:顯示這一行的數據是關於哪張表的。

type:連接類型,結果值從好到壞依次是:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL。一般來說,得保證查詢至少達到 range 級別,最好能達到 ref。如果值為 index,則說明 MySQL 使用了索引掃描來做排序。

possible_keys :指出 MySQL 能使用哪個索引在表中找到行,查詢涉及到的字段上若存在索引,則該索引將被列出,但不一定被查詢使用

key: 顯示 MySQL 在查詢中實際使用的索引,若沒有使用索引,顯示為 NULL。

key_len :表示索引中使用的字節數,可通過該列計算查詢中使用的索引的長度。

ref :表示上述表的連接匹配條件,即哪些列或常量被用於查找索引列上的值。

rows :表示 MySQL 根據表統計信息及索引選用情況,估算的找到所需的記錄所需要讀取的行數。

Extra :包含不適合在其他列中顯示但十分重要的額外信息。如 using where(這表示 MySQL 服務器將存儲引擎返回行以後再應用 where 過濾條件);using index(使用了覆蓋索引)

MySQL索引的使用及註意事項