分析利器 — MySQL Explain Analyze
原創昨天發表的文章中,對比多種數據庫對SQL的邏輯優化能力。有朋友留言談到可以使用 MySQL Explan Analyze 方式查看執行情況,較為直觀和準確。之前對這個命令了解不多,特測試了一下。本文簡單總結下 Explan Analyze 的使用之法。
1. MySQL Explain Analyze 概述
EXPLAIN ANALYZE是MySQL 8.0.18引入的查詢分析工具,它在傳統EXPLAIN的基礎上擴展了實際執行數據的統計功能。不僅生成查詢計劃,還會實際執行SQL語句,并輸出每個執行算子(Iterator)的實際耗時、掃描行數、循環次數等詳細信息,幫助開發者更精準地定位性能瓶頸。
(1)與Explain (Extended) 對比
這里與傳統的 Explain 方法進行對比,這里引用來自DeepSeek的一段描述
總結來說,EXPLAIN ANALYZE 適合生產環境調優(但需注意真實執行開銷),通過實際執行數據精準定位問題(如索引失效或統計信息偏差)。傳統EXPLAIN,則適合快速驗證查詢計劃,避免執行開銷。EXPLAIN EXTENDED,在舊版本中用于深度分析優化器邏輯,現逐漸被FORMAT=JSON或FORMAT=TREE取代。
(2)Explain Analyze 示例
- 執行順序:按照從右到左、從上到下來解析。以樹狀層級展示執行流程,直觀顯示操作順序。
- 執行時間:分兩段顯示( actual time=0.0541..2.03),分別表示獲取第一行和所有行的耗時。
- 預估成本:顯示預估成本( cost=1019)
- 返回行數:顯示預估行數( rows=10117)與實際返回行數(rows=10000),幫助發現統計信息偏差。
- 循環次數(loops=N):表示迭代器執行次數,尤其在嵌套循環連接中體現驅動表與被驅動表的關系。
(3)與傳統輸出執行計劃對比
之前大家經常詬病的MySQL執行計劃輸出簡單,解讀困難;通過 Analyze 的方式不僅內容更加豐富,而且更容易解讀。這里列一個稍微復雜的示例。
同樣的語句用Analyze方式輸出,細節豐富了很多。
2. 通過 Analyze 方式解讀執行計劃
Analyze 方式可以讓我們更好地理解 MySQL 的執行過程,可與 Explain 配合來使用。下面通過幾個典型示例,說明下使用 Analyze 的優點。
(1)表關聯
針對表關聯,一是區分關聯類型(嵌套、哈希),一是區分驅動關系(驅動表、被驅動表)。這兩點通過樹形層次結構都體現的比較清晰。此外,包括內層循環次數等,也都一目了然。
(2)集合操作
原有輸出中是通過ID來表示執行順序的,不是很直觀。在集合示例中,層次結構表達的執行次序很清晰。
(3)聚合函數
對于聚合函數而言,傳統方式說明使用二級索引掃描的方式得到結果,但Analyze 方式反而沒有,這里有點奇怪。