【MySQL】SQL執行計劃分析

執行計劃能告訴我們什麼?

當我們的系統上線後資料庫的記錄不斷增加,之前寫的一些SQL語句或者一些ORM操作效率變得非常低。我們不得不考慮SQL優化,SQL優化大概是這樣一個流程:1.定位執行效率低的SQL語句(定位),2.分析為什麼這段SQL執行的效率比較低(分析),3.最後根據第二步分析的結構採取優化措施(解決)。而EXPLAIN命令的作用就是幫助我們分析SQL的執行情況,屬於第二步。說的規範一點就是:EXPLAIN命令是檢視查詢優化器如何決定執行查詢的主要的方法。學會解釋EXPLAIN將幫助我們瞭解SQL優化器是如何工作的。執行計劃可以告訴我們SQL如何使用索引,連線查詢的執行順序,查詢的資料行數。

如何使用執行計劃?

要使用EXPLAIN,只需要在查詢的SELECT關鍵字之前增加EXPLAIN這個詞。

下面是一個簡單EXPLAIN的結果:

解釋執行計劃中EXPLAIN的列

ID列

是一位數字,表示執行SELECT語句的順序。
id值相同執行順序從上到下。
id值不同時id值大的先執行。

SELECT_TYPE
這一列顯示了對應行是簡單還是複雜SELECT.取值如下:SIMPLE值意味著查詢不包括子查詢和UNION。查詢有任何複雜的子部分,則最外層標記為PRIMARY.取值如下:

TABLE

輸出資料行所在的表的名稱

PARTITIONS

對於分割槽表,顯示查詢的分割槽ID,對於非分割槽表,顯示為NULL

TYPE

EXTRA

POSSIBLE_KEYS

指出MySQL能使用哪些索引來優化查詢,查詢所涉及的列上的索引都會被列出,但不一定會被使用

KEY

查詢優化器優化查詢實際所使用的索引,如果沒有可用的索引,則顯示為NULL,如查詢使用了覆蓋索引,則該索引僅出現在Key列中

KEY_LEN

表示索引欄位的最大可能長度,KEY_LEN的長度由欄位定義計算而來,並非資料的實際長度

REF

表示哪些列或常量被用於查詢索引列上的值

ROWS

表示MySQL通過哪些列或常量被用於查詢索引列上的值,ROWS值的大小是個統計抽樣結果,並不十分準確

Filtered

表示返回結果的行數佔需讀取行數的百分比,Filter列的值越大越好

執行計劃的限制

無法展示儲存過程,觸發器,UDF(自定義函式)對查詢的影響

無法使用EXPLAIN對儲存過程進行分析

早期版本的MySQL只支援對SELECT語句進行分析,如果想要分析UPDATE,INSERT語句需要將它們通過某種手段轉換成SELECT語句。