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

MySQL Profiler 性能分析實戰:從開啟到解讀執行細節

     編輯:MySQL 資料庫相關知識

MySQL 5.0.37+ 內建 SHOW PROFILE 功能,可精確到微秒級拆解 SQL 執行全生命週期各階段耗時,是定位疑難慢查詢的利器。本文通過實例演示如何開啟、執行對比、解讀輸出,並說明查詢快取對二次執行的加速效果。

1. 開啟 Profiler

SELECT @@profiling;  -- 0=關閉, 1=開啟
SET profiling = 1;   -- 當前 Session 生效
SELECT @@profiling;  -- 確認已開啟

2. 實測對比:建表與兩次 COUNT(*)

-- 建表並寫入 57344 行
CREATE TABLE t_engines SELECT * FROM t_engines1;
-- 耗時 0.102 秒

-- 第一次 COUNT(*)
SELECT COUNT(*) FROM t_engines;
-- 耗時 0.00033 秒

-- 第二次 COUNT(*) (命中查詢快取)
SELECT COUNT(*) FROM t_engines;
-- 耗時 0.000039 秒

3. 查看執行檔案

SHOW PROFILES;
-- 列出最近執行的語句及 Query_ID、總耗時

SHOW PROFILE FOR QUERY 27;  -- 第一次 COUNT 詳細階段
SHOW PROFILE FOR QUERY 28;  -- 第二次 COUNT 詳細階段

4. 關鍵輸出解讀

Query 27 (首次執行,物理讀)

Status                      Duration
starting                    0.000004
checking query cache        0.000041
checking permissions        0.000011
Opening tables              0.000183
System lock                 0.000005
Table lock                  0.000018
init                        0.000011
optimizing                  0.000006
executing                   0.000028
end                         0.000005
query end                   0.000003
storing result in query cache 0.000004
freeing items               0.000004
closing tables              0.000005
logging slow query          0.000003
Total: ~0.000327 秒

Query 28 (二次執行,命中快取)

Status                      Duration
starting                    0.000004
checking query cache        0.000008
checking privileges on cached query 0.000005
checking permissions        0.000005
sending cached result to client 0.000013
logging slow query          0.000005
Total: ~0.000039 秒

5. 核心洞察

  • 快取加速明顯:二次執行耗時約為首次的 1/8,省去 Opening tables、Table lock、optimizing、executing 等階段,直接 sending cached result。
  • 階段耗時分布:首次執行主要耗時在 Opening tables (56%)、checking query cache (12%)、Table lock (5%)。
  • INFORMATION_SCHEMA.PROFILING 可彙總特定 Query_ID 總耗時:
    SELECT SUM(DURATION) FROM INFORMATION_SCHEMA.PROFILING WHERE QUERY_ID=27;

6. 適用場景與限制

  • 適合:定位單條 SQL 內部耗時分布、驗證快取效果、對比優化前後。
  • 不適合:全庫慢查詢掃描(用 Slow Log)、生產環境持續監控(開啟有微小開銷)。
  • MySQL 5.7+ 已棄用 SHOW PROFILE,建議改用 Performance Schema (events_statements_history_long) 獲得更豐富、持久化的分析數據。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved