MySQL索引的使用及注意事項
索引 是儲存引擎用於快速找到記錄的一種資料結構。 索引優化應該是對查詢效能優化最有效的手段了 。索引能夠輕易將查詢效能提高几個數量級,"最優"的索引有時比一個"好的"索引效能要好兩個數量級。
索引可以包含一個( 單列索引 )或多個列( 組合索引 )的值。
想要使用組合索引首先要了解一個原則:最 左字首原則 。如果索引包含多個列,那麼列的順序十分重要,因為 SQL/">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(使用了覆蓋索引) 。
Linux公社的RSS地址 : ofollow,noindex" target="_blank">https://www.linuxidc.com/rssFeed.aspx
本文永久更新連結地址: https://www.linuxidc.com/Linux/2018-11/155369.htm