分析利器 — MySQL Explain Analyze
原創(chuàng)昨天發(fā)表的文章中,對比多種數(shù)據(jù)庫對SQL的邏輯優(yōu)化能力。有朋友留言談到可以使用 MySQL Explan Analyze 方式查看執(zhí)行情況,較為直觀和準(zhǔn)確。之前對這個命令了解不多,特測試了一下。本文簡單總結(jié)下 Explan Analyze 的使用之法。
1. MySQL Explain Analyze 概述
EXPLAIN ANALYZE是MySQL 8.0.18引入的查詢分析工具,它在傳統(tǒng)EXPLAIN的基礎(chǔ)上擴展了實際執(zhí)行數(shù)據(jù)的統(tǒng)計功能。不僅生成查詢計劃,還會實際執(zhí)行SQL語句,并輸出每個執(zhí)行算子(Iterator)的實際耗時、掃描行數(shù)、循環(huán)次數(shù)等詳細信息,幫助開發(fā)者更精準(zhǔn)地定位性能瓶頸。
(1)與Explain (Extended) 對比
這里與傳統(tǒng)的 Explain 方法進行對比,這里引用來自DeepSeek的一段描述

總結(jié)來說,EXPLAIN ANALYZE 適合生產(chǎn)環(huán)境調(diào)優(yōu)(但需注意真實執(zhí)行開銷),通過實際執(zhí)行數(shù)據(jù)精準(zhǔn)定位問題(如索引失效或統(tǒng)計信息偏差)。傳統(tǒng)EXPLAIN,則適合快速驗證查詢計劃,避免執(zhí)行開銷。EXPLAIN EXTENDED,在舊版本中用于深度分析優(yōu)化器邏輯,現(xiàn)逐漸被FORMAT=JSON或FORMAT=TREE取代。
(2)Explain Analyze 示例

- 執(zhí)行順序:按照從右到左、從上到下來解析。以樹狀層級展示執(zhí)行流程,直觀顯示操作順序。
- 執(zhí)行時間:分兩段顯示( actual time=0.0541..2.03),分別表示獲取第一行和所有行的耗時。
- 預(yù)估成本:顯示預(yù)估成本( cost=1019)
- 返回行數(shù):顯示預(yù)估行數(shù)( rows=10117)與實際返回行數(shù)(rows=10000),幫助發(fā)現(xiàn)統(tǒng)計信息偏差。
- 循環(huán)次數(shù)(loops=N):表示迭代器執(zhí)行次數(shù),尤其在嵌套循環(huán)連接中體現(xiàn)驅(qū)動表與被驅(qū)動表的關(guān)系。
(3)與傳統(tǒng)輸出執(zhí)行計劃對比
之前大家經(jīng)常詬病的MySQL執(zhí)行計劃輸出簡單,解讀困難;通過 Analyze 的方式不僅內(nèi)容更加豐富,而且更容易解讀。這里列一個稍微復(fù)雜的示例。

同樣的語句用Analyze方式輸出,細節(jié)豐富了很多。

2. 通過 Analyze 方式解讀執(zhí)行計劃
Analyze 方式可以讓我們更好地理解 MySQL 的執(zhí)行過程,可與 Explain 配合來使用。下面通過幾個典型示例,說明下使用 Analyze 的優(yōu)點。
(1)表關(guān)聯(lián)
針對表關(guān)聯(lián),一是區(qū)分關(guān)聯(lián)類型(嵌套、哈希),一是區(qū)分驅(qū)動關(guān)系(驅(qū)動表、被驅(qū)動表)。這兩點通過樹形層次結(jié)構(gòu)都體現(xiàn)的比較清晰。此外,包括內(nèi)層循環(huán)次數(shù)等,也都一目了然。


(2)集合操作
原有輸出中是通過ID來表示執(zhí)行順序的,不是很直觀。在集合示例中,層次結(jié)構(gòu)表達的執(zhí)行次序很清晰。

(3)聚合函數(shù)
對于聚合函數(shù)而言,傳統(tǒng)方式說明使用二級索引掃描的方式得到結(jié)果,但Analyze 方式反而沒有,這里有點奇怪。

(4)表過濾





























