MySQL索引的使用及註意事項
索引是存儲引擎用於快速找到記錄的一種數據結構。索引優化應該是對查詢性能優化最有效的手段了。索引能夠輕易將查詢性能提高幾個數量級,"最優"的索引有時比一個"好的"索引性能要好兩個數量級。
索引可以包含一個(單列索引)或多個列(組合索引)的值。
想要使用組合索引首先要了解一個原則:最左前綴原則。如果索引包含多個列,那麽列的順序十分重要,因為 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 比較,就不能使用索引
-
如果查詢中有某個列的範圍查詢,則其右邊所有列都無法使用索引優化查找。例如: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索引的使用及註意事項