mysql查询优化explain命令详解
轉載自?mysql查詢優化explain命令詳解
mysql查詢優化的方法有很多種,explain是工作當中用的比較多的一種檢查方式。explain翻譯即解釋,就是看mysql語句的查詢解釋計劃,從解釋計劃我們能很清楚的看到解釋的語句有沒有合理用到索引,掃描了多少行數,有沒有觸及全表掃描、用到臨時表等影響慢查詢的原因。
使用很簡單,如
explain?select * from user ...
執行后會出現解釋計劃的表格,意義可參考下面的參數,針對這些解釋計劃,我們可以作為相對應的優化。
id????mysql查詢標識符,即序號。
select_type????查詢類型
simple:即簡單select 查詢,不包含union及子查詢;
primary:最外層的 select 查詢;
union:表示此查詢是 union 的第二或隨后的查詢;
dependent union:union 中的第二個或后面的查詢語句, 取決于外面的查詢;
union result:union的結果;
subquery:子查詢中的第一個select;
dependent subquery:子查詢中的第一個select,取決于外面的查詢,即子查詢依賴于外層查詢的結果。
table????所有查詢到的表。
? ? ? ? ?
type????聯接類型,比較重要的項,從這一項可以看出是否高效的重要依據
性能從好到壞依次如下:
system:表中只有一條數據,這是一個特殊的const?類型;
const:針對主鍵或唯一索引的等值查詢掃描,最多只返回一行數據,const 查詢速度非常快,因為它僅僅讀取一次即可;
eq_ref:此類型通常出現在多表的 join 查詢,表示對于前表的每一個結果,都只能匹配到后表的一行結果,并且查詢的比較操作通常是=, 查詢效率較高;
ref:此類型通常出現在多表的 join 查詢, 針對于非唯一或非主鍵索引, 或者是使用了?最左前綴?規則索引的查詢;
fulltext:全文索引檢索,要注意,全文索引的優先級很高,若全文索引和普通索引同時存在時,mysql不管代價,優先選擇使用全文索引;
ref_or_null:與ref方法類似,只是增加了null值的比較。實際用的不多;
unique_subquery:用于where中的in形式子查詢,子查詢返回不重復值唯一值;
index_subquery:用于in形式子查詢使用到了輔助索引或者in常數列表,子查詢可能返回重復值,可以使用索引將子查詢去重;
index_merge:表示查詢使用了兩個以上的索引,最后取交集或者并集,常見and,or的條件使用了不同的索引,官方排序這個在ref_or_null之后,但是實際上由于要讀取所個索引,性能可能大部分時間都不如range;
range:表示使用索引范圍查詢,通過索引字段范圍獲取表中部分數據記錄。這個類型通常出現在 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, IN操作中,此時輸出的?ref?字段為 NULL并且key_len字段是此次查詢中使用到的索引的最長的那個;
index:全表掃描,只是掃描表的時候按照索引次序進行而不是行。主要優點就是避免了排序,但是開銷仍然非常大,這種情況時, Extra 字段會顯示?Using index;
all:性能最差的情況,使用了全表掃描,系統必須避免出現這種情況。
possible_keys????可能用到的索引。
? ? ? ??
key????真正用到的索引。
? ? ? ? ?
key_len????使用了索引字節的長度。
? ? ? ? ?
ref? 顯示索引的哪一列被使用了。
? ? ? ? ?
rows????掃描了多少行數,也是性能評估的重要依據。
? ? ? ? ?
extra?額度信息,常見的有以下幾種。 ?
Distinct:一旦找到了與行相聯合匹配的行就不再搜索了;
Using filesort:使用了文件排序,性能非常慢,需要優化。
Using index:查詢使用到了索引,列數據是從僅僅使用了索引中的信息而沒有讀取實際的行動的表返回的,這發生在對表的全部的請求列都是同一個索引的部分的時候。
Using temporary:使用了臨時表排序,性能非常慢,需要優化。
Using where:表示使用了where進行查詢,不是很重要。
ALL:這個連接類型對于前面的每一個記錄聯合進行完全掃描,這一般比較糟糕,需要優化。
具體的對執行計劃解釋可以參考msyql官網:
https://dev.mysql.com/doc/refman/5.7/en/explain-output.html
擴展
另外,mysql5.6增加了對insert/update/delete的explain支持,用法一樣。
總結
以上是生活随笔為你收集整理的mysql查询优化explain命令详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑上如何关闭临时配置文件登录?
- 下一篇: 从开发者角度谈Mysql主键