explain mysql 結果分析

    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 的組成而使用的優化方法,能夠部分減小數據訪問次數。

相關文章
相關標籤/搜索