SET profiling = 1;SHOW PROFILES; 列出最近查詢及總耗時。SHOW PROFILE FOR QUERY n; 看某查詢各階段耗時(解析、優化、執行、鎖等待、Sending data…)。
mysql> SET profiling=1;
mysql> SELECT * FROM t WHERE id=1;
mysql> SHOW PROFILES;
+----------+------------+----------------------+
| Query_ID | Duration | Query |
+----------+------------+----------------------+
| 1 | 0.00034500 | SELECT * FROM t ... |
+----------+------------+----------------------+
mysql> SHOW PROFILE FOR QUERY 1;
+----------------------+----------+
| Status | Duration |
+----------------------+----------+
| starting | 0.000045 |
| checking permissions | 0.000012 |
| Opening tables | 0.000021 |
| ... | ... |
| Sending data | 0.000180 |
| end | 0.000003 |
+----------------------+----------+
優點:可見「哪個階段慢」。
缺點:僅對當前 Session 有效,重連失效;MySQL 8.0 棄用,建議改用 Performance Schema。
SET @start = NOW(6); -- 微秒精度
SELECT * FROM large_table WHERE ...;
SELECT TIMESTAMPDIFF(MICROSECOND, @start, NOW(6)) AS elapsed_us;
關鍵:三條語句必須一次性發送(客戶端批次執行或存儲過程),否則網路延遲、人工按鍵會汙染結果。
-- 確保啟用
UPDATE performance_schema.setup_instruments SET ENABLED='YES', TIMED='YES' WHERE NAME LIKE 'statement/%';
UPDATE performance_schema.setup_consumers SET ENABLED='YES' WHERE NAME LIKE 'events_statements%';
-- 查詢最近慢 SQL
SELECT DIGEST_TEXT, AVG_TIMER_WAIT/1e12 AS avg_sec, COUNT_STAR
FROM performance_schema.events_statements_summary_by_digest
ORDER BY AVG_TIMER_WAIT DESC LIMIT 10;
無侵入、持久化、支援聚合統計,生產環境首選。
| 場景 | 推薦工具 |
|---|---|
| 開發/測試單條 SQL 逐階段分析 | SHOW PROFILE |
| 快速手工基準測試 | TIMESTAMPDIFF + 批次執行 |
| 生產環境持續監控、Top SQL | Performance Schema / sys schema |
| 慢查詢審計 | slow_query_log + pt-query-digest |