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