explain mysql 結果分析說明mysql
Explain命令在解決數據庫性能上是第一推薦使用命令,大部分的性能問題能夠經過此命令來簡單的解決,Explain能夠用來查看SQL語句的執行效 果,能夠幫助選擇更好的索引和優化查詢語句,寫出更好的優化語句。算法
Explain語法:explain select … from … [where …]sql
例如:explain select * from news;數據庫
輸出:數據結構
+----+-------------+-------+-------+-------------------+---------+---------+-------+------
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+-------------------+---------+---------+-------+------函數
下面對各個屬性進行了解:性能
一、id:這是SELECT的查詢序列號大數據
二、select_type:select_type就是select的類型,能夠有如下幾種:優化
SIMPLE:簡單SELECT(不使用UNION或子查詢等)排序
PRIMARY:最外面的SELECT
UNION:UNION中的第二個或後面的SELECT語句
DEPENDENT UNION:UNION中的第二個或後面的SELECT語句,取決於外面的查詢
UNION RESULT:UNION的結果。
SUBQUERY:子查詢中的第一個SELECT
DEPENDENT SUBQUERY:子查詢中的第一個SELECT,取決於外面的查詢
DERIVED:導出表的SELECT(FROM子句的子查詢)
三、table:顯示這一行的數據是關於哪張表的
四、type:這列最重要,顯示了鏈接使用了哪一種類別,有無使用索引,是使用Explain命令分析性能瓶頸的關鍵項之一。
結果值從好到壞依次是:
system>const>eq_ref>ref<range>index>all(倒序),通常來講,保證查詢至少達到range級別,最好能達到ref
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
這是explain中很是重要的一個字段,常見的類型從好到壞有
system:系統表,表中只有一行數據;
const:惟一性索引掃描,對於每一個索引建,表中只有一條記錄和它匹配
eq_ref:最多隻會有一條匹配結果,通常是經過主鍵或惟一鍵索引來訪問。
ref:非惟一性索引掃描,本質上也是一種索引訪問,返回全部匹配某個單獨值的行
fulltext:進行全文索引檢索。
ref_or_null:與ref的惟一區別就是在使用索引引用的查詢以外再增長一個空值的查詢。
index_merge:查詢中同時使用兩個(或更多)索引,而後對索引結果進行合併(merge),再讀取表數據。
unique_subquery:子查詢中的返回結果字段組合是主鍵或惟一約束。
index_subquery:子查詢中的返回結果字段組合是一個索引(或索引組合),但不是一個主鍵或惟一索引。
range:只查找範圍內的數據,使用索引來匹配行,查詢的範圍縮小了,本身比前面的類型性能更好
index:(full index scan)全索引文件掃描比all要好很多,將直接從索引數據結構中找尋數據,比全表掃描理論上快很多
all:(full table scan)表明全表掃描,在大數據量級下,全表掃描的sql性能無疑將拖慢可以系統給的響應速度
通常來講,得保證查詢至少達到range級別,最好能達到ref,不然就可能會出現性能問題。
五、possible_keys:列指出MySQL能使用哪一個索引在該表中找到行
六、key:顯示MySQL實際決定使用的鍵(索引)。若是沒有選擇索引,鍵是NULL
七、key_len:顯示MySQL決定使用的鍵長度。若是鍵是NULL,則長度爲NULL。使用的索引的長度。在不損失精確性的狀況下,長度越短越好
八、ref:顯示使用哪一個列或常數與key一塊兒從表中選擇行。
九、rows:顯示MySQL認爲它執行查詢時必須檢查的行數。
十、Extra:包含MySQL解決查詢的詳細信息,也是關鍵參考項之一。
Extra:查詢中每一步實現的額外細節信息,主要會是如下內容。
Distinct:查找distinct 值,當mysql找到了第一條匹配的結果時,將中止該值的查詢,轉爲後面其餘值查詢。
Full scan on NULL key:子查詢中的一種優化方式,主要在遇到沒法經過索引訪問null值的使用。
Range checked for each record (index map: N):經過 MySQL 官方手冊的描述,當 MySQL Query Optimizer 沒有發現好的可使用的索引時,若是發現前面表的列值已知,部分索引可使用。對前面表的每一個行組合,MySQL檢查是否可使用range或 index_merge訪問方法來索取行。
SELECT tables optimized away:當咱們使用某些聚合函數來訪問存在索引的某個字段時,MySQL Query Optimizer 會經過索引直接一次定位到所需的數據行完成整個查詢。固然,前提是在 Query 中不能有 GROUP BY 操做。如使用MIN()或MAX()的時候。
Using filesort:當Query 中包含 ORDER BY 操做,並且沒法利用索引完成排序操做的時候,MySQL Query Optimizer 不得不選擇相應的排序算法來實現。
Using index:所需數據只需在 Index 便可所有得到,不需要再到表中取數據。
Using index for group-by:數據訪問和 Using index 同樣,所需數據只需要讀取索引,當Query 中使用GROUP BY或DISTINCT 子句時,若是分組字段也在索引中,Extra中的信息就會是 Using index for group-by。
Using temporary:當 MySQL 在某些操做中必須使用臨時表時,在 Extra 信息中就會出現Using temporary 。主要常見於 GROUP BY 和 ORDER BY 等操做中。
Using where:若是不讀取表的全部數據,或不是僅僅經過索引就能夠獲取全部須要的數據,則會出現 Using where 信息。
Using where with pushed condition:這是一個僅僅在 NDBCluster存儲引擎中才會出現的信息,並且還需要經過打開 Condition Pushdown 優化功能纔可能被使用。控制參數爲 engine_condition_pushdown 。
Impossible WHERE noticed after reading const tables:MySQL Query Optimizer 經過收集到的統計信息判斷出不可能存在結果。
No tables:Query 語句中使用 FROM DUAL或不包含任何 FROM子句。
Not exists:在某些左鏈接中,MySQL Query Optimizer經過改變原有 Query 的組成而使用的優化方法,能夠部分減小數據訪問次數。