執行計划能告訴我們什么?
當我們的系統上線后數據庫的記錄不斷增加,之前寫的一些SQL語句或者一些ORM操作效率變得非常低。我們不得不考慮SQL優化,SQL優化大概是這樣一個流程:1.定位執行效率低的SQL語句(定位),2.分析為什么這段SQL執行的效率比較低(分析),3.最后根據第二步分析的結構采取優化措施(解決)。而EXPLAIN命令的作用就是幫助我們分析SQL的執行情況,屬於第二步。說的規范一點就是:EXPLAIN命令是查看查詢優化器如何決定執行查詢的主要的方法。學會解釋EXPLAIN將幫助我們了解SQL優化器是如何工作的。執行計划可以告訴我們SQL如何使用索引,連接查詢的執行順序,查詢的數據行數。
如何使用執行計划?
要使用EXPLAIN,只需要在查詢的SELECT關鍵字之前增加EXPLAIN這個詞。
解釋執行計划中EXPLAIN的列
ID列
是一位數字,表示執行SELECT語句的順序。
id值相同執行順序從上到下。
id值不同時id值大的先執行。
這一列顯示了對應行是簡單還是復雜SELECT.取值如下:SIMPLE值意味着查詢不包括子查詢和UNION。查詢有任何復雜的子部分,則最外層標記為PRIMARY.取值如下:![]()
ABLE
輸出數據行所在的表的名稱
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語句。