首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL SQL 執行時間測量兩大法:SHOW PROFILE 與 TIMESTAMPDIFF

     編輯:MySQL 資料庫相關知識

方法一:SHOW PROFILE(精準到階段)

  1. 開啟 profiling:SET profiling = 1;
  2. 執行目標 SQL。
  3. SHOW PROFILES; 列出最近查詢及總耗時。
  4. 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。

方法二:TIMESTAMPDIFF 微秒級計時(簡易基準測試)


SET @start = NOW(6);          -- 微秒精度
SELECT * FROM large_table WHERE ...;
SELECT TIMESTAMPDIFF(MICROSECOND, @start, NOW(6)) AS elapsed_us;

關鍵:三條語句必須一次性發送(客戶端批次執行或存儲過程),否則網路延遲、人工按鍵會汙染結果。

方法三:Performance Schema(MySQL 5.6+ 推薦)


-- 確保啟用
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 SQLPerformance Schema / sys schema
慢查詢審計slow_query_log + pt-query-digest
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved