1、什么是Explain Analyze?
Explain 是我們常用的查詢分析工具,可以對查詢語句的執行方式進行評估(並非實際的執行情況,可能與實際情況存在較大差距),給出很多有用的線索。
Explain Analyze 是 MySQL 8 中提供的查詢性能分析工具,牛X之處在於可以給出實際執行情況,可以詳細的顯示出查詢語句執行過程中,每一步花費了多少時間。
Explain Analyze 會做出查詢計划,並且會實際執行,以測量出查詢計划中各個關鍵點的實際指標,例如耗時、條數,最后詳細的打印出來。
2、EXPLAIN的語法
EXPLAIN [ ANALYZE ] [ VERBOSE ] statement
參數解釋:
ANALYZE:執行命令並顯示實際運行時間。
VERBOSE:顯示規划樹完整的內部表現形式,而不僅是一個摘要。通常,這個選項只是在特殊的調試過程中有用。VERBOSE輸出是否打印工整的,具體取決於配置參數 explain_pretty_print 的值。
statement:查詢執行計划的 SQL 語句,可以是任何select、insert、update、delete、values、execute、declare 語句。
3、EXPLAIN和EXPLAIN ANALYZE區別
(1)、EXPLAIN展示查詢優化器對該查詢計划估計的代價,但是不執行該查詢。
例如:EXPLAIN SELECT * FROM test WHERE id=2;
(2)、EXPLAIN ANALYZE不僅會顯示查詢計划,還會實際運行語句。
EXPLAIN ANALYZE會丟掉任何來自SELECT語句的輸出,但是該語句中的其他操作會被執行(例如INSERT、UPDATE或者DELETE)。
要在DML語句上使用EXPLAIN ANALYZE卻不讓該命令影響數據,可以明確地把EXPLAIN ANALYZE用在一個事務中:
(BEGIN; EXPLAIN ANALYZE ...; ROLLBACK;)。
EXPLAIN ANALYZE運行語句后除了顯示計划外,還有下列額外的信息:
1、運行該查詢消耗的總時間(以毫秒計) 計划節點操作中涉及的工作者(Segment)數量
2、操作中產生最多行的Segment返回的最大行數(及其Segment ID) 操作所使用的內存
3、從產生最多行的Segment中檢索到第一行所需的時間(以毫秒計),以及從該Segment中檢索所有行花費的總時間。
例如:EXPLAIN ANALYZE SELECT * FROM test WHERE id=2;
4、閱讀EXPLAIN 輸出
查詢計划類似於一棵有節點的樹,執行和閱讀的順序是自底而上。計划中的每個節點表示一個操作,例如表掃描、表連接、聚集或者排序。閱讀的順序是從底向上:每個節點會把結果輸出給直接在它上面的節點。一個計划中的底層節點通常是表掃描操作:順序掃描表、通過索引或者位圖索引掃描表等。如果該查詢要求那些行上的連接、聚集、排序或者其他操作,就會有額外的節點在掃描節點上面負責執行這些操作。最頂層的計划節點通常是數據庫的移動(MOTION)節點:重分布(REDISTRIBUTE)、廣播(BROADCAST)或者收集(GATHER)節點。這些操作在查詢處理時在實例節點之間移動數據。
EXPLAIN的輸出對於查詢計划中的每個節點都顯示為一行並顯示該節點類型和下面的執行的代價估計:
cost:以磁盤頁面獲取為單位度量。1.0等於一次順序磁盤頁面讀取。第一個估計是得到第一行的啟動代價,第二個估計是得到所有行的總代價。
rows:這個計划節點輸出的總行數。這個數字根據條件的過濾因子會小於被該計划節點處理或者掃描的行數。最頂層節點的是估算的返回、更新或者刪除的行數。
width: 這個計划節點輸出的所有行的總字節數。
需要注意以下兩點:
一個節點的代價包括其子節點的代價。最頂層計划節點有對於該計划估計的總執行代價。這是優化器估算出來的最小的數字。
代價只反映了在數據庫中執行的時間,並沒有計算在數據庫執行之外的時間,例如將結果行傳送到客戶端花費的時間。
rows:根據統計信息估計SQL返回結果集的行數
width:返回的結果集的每一行的長度,這個長度值是根據pg_statistic表中的統計信息來計算的。