1. Explain Analyze 介紹
Explain 是我們常用的查詢分析工具,可以對查詢語句的執行方式進行評估,給出很多有用的線索。
但他僅僅是評估,不是實際的執行情況,比如結果中的 rows,可能和實際結果相差甚大。
Explain Analyze 是 MySQL 8 中提供的新工具,牛X之處在於可以給出實際執行情況。
Explain Analyze 是一個查詢性能分析工具,可以詳細的顯示出 查詢語句執行過程中,都在哪兒花費了多少時間。
Explain Analyze 會做出查詢計划,並且會實際執行,以測量出查詢計划中各個關鍵點的實際指標,例如耗時、條數,最后詳細的打印出來。
2. 實踐效果
例如有如下一條查詢語句:
SELECT first_name, last_name, SUM(amount) AS total
FROM staff INNER JOIN payment
ON staff.staff_id = payment.staff_id
AND
payment_date LIKE '2005-08%'
GROUP BY first_name, last_name;
現在對它執行 Explain Analyze,只需要添加在 SELECT 前邊就行了:
EXPLAIN ANALYZE
SELECT first_name, last_name, SUM(amount) AS total
FROM staff INNER JOIN payment
ON staff.staff_id = payment.staff_id
AND
payment_date LIKE '2005-08%'
GROUP BY first_name, last_name;
執行結果:
結果中包含了各個執行步驟的詳細情況,內容比較多,圖片中不方便看,下面咱就拿出其中一條看一下:
Filter: (payment.payment_date like '2005-08%')
(cost=117.43 rows=894)
(actual time=0.454..194.045 rows=2844 loops=2)
Filter
表示這是執行過濾的一個步驟。
(payment.payment_date like '2005-08%')
這部分是過濾條件。
(cost=117.43 rows=894)
這部分是估算的結果,預計需要花費的時間,和返回的記錄條數。
這就是在真正執行之前,查詢優化器所做的估算。
(actual time=0.454..194.045 rows=2844 loops=2)
這部分就是實際執行的結果數據了。
time
的結果中分為2個部分,前面的 0.454
是返回第一條記錄的耗時,后面的 194.045
是返回所有記錄的耗時。
rows
就是實際返回的准確記錄條數。
loops
是當前過濾迭代器所執行的循環的數量。
3. 實際環境
如果你想實際試試,可以使用 MySQL 提供的測試數據庫 sakila。
下載地址:
https://dev.mysql.com/doc/index-other.html

解壓后倒入MySQL:
mysql> SOURCE /xxx/sakila-schema.sql;
mysql> SOURCE /xxx/sakila-data.sql;
4. 小結
感謝閱讀,希望對你有所幫助 🙏
參考資料:
https://mysqlserverteam.com/mysql-explain-analyze/
https://www.percona.com/blog/2019/10/28/using-explain-analyze-in-mysql-8/