SHOW PROFILE 是 MySQL 5.0.37+ 內建的 SQL 剖析工具,能將一條查詢拆解為 20+ 個內部執行步驟,並量化每步的耗時、CPU、I/O、上下文切換等資源消耗。它是定位單條 SQL 瓶頸的「顯微鏡」。
-- 查看狀態 SHOW VARIABLES LIKE '%profil%'; -- 會話級開啟 SET profiling = 1; -- 驗證 SELECT @@profiling; -- 1 表示生效
profiling_history_size(預設 15)控制保留多少條記錄,設為 0 即禁用。
SELECT * FROM hx_line WHERE id = '1455023';
SHOW PROFILES;
輸出包含 Query_ID、Duration、Query 文本。
SHOW PROFILE FOR QUERY 1;
輸出解讀(關鍵階段):
| Status 階段 | 含義 | 關注點 |
|---|---|---|
| starting | 啟動查詢 | 通常極快 |
| checking query cache | 查詢緩存檢查 | 若關閉緩存可減少此步 |
| Opening tables / System lock | 打開表、系統鎖 | 元數據鎖競爭會在此顯現 |
| optimizing / statistics / preparing | 優化器階段 | 統計資訊不準會導致錯誤計劃 |
| executing | 執行階段 | 核心計算邏輯 |
| Sending data | 發送數據給客戶端 | 通常最耗時,含磁盤讀取、網絡傳輸 |
| end / query end / cleaning up | 收尾階段 | 釋放資源、記錄慢查詢日誌 |
關閉緩存後步驟從 24 步減至 16 步,耗時減少 0.000087s。結論:簡單點查詢場景下,Query Cache 反而增加開銷。
-- CPU 使用情況 SHOW PROFILE CPU FOR QUERY 1; -- 綜合 Block I/O + CPU SHOW PROFILE BLOCK IO, CPU FOR QUERY 1;
輸出新增 CPU_user、CPU_system、Block_ops_in、Block_ops_out 欄位,可識別是 CPU 密集還是 I/O 密集。
SELECT STATE, SUM(DURATION) AS Total_R, ROUND(100 * SUM(DURATION) / (SELECT SUM(DURATION) FROM INFORMATION_SCHEMA.PROFILING WHERE QUERY_ID = 1), 2) AS Pct_R, COUNT(*) AS Calls, SUM(DURATION) / COUNT(*) AS "R/Call" FROM INFORMATION_SCHEMA.PROFILING WHERE QUERY_ID = 1 GROUP BY STATE ORDER BY Total_R DESC;
實戰案例中,Copying to tmp table 佔 81.26%、Sending data 佔 17.76% —— **臨時表操作是核心瓶頸**,提示需優化 GROUP BY/ORDER BY 或增加內存臨時表大小。
ALL:所有資訊BLOCK IO:磁塊讀寫計數CONTEXT SWITCHES:上下文切換IPC:進程間通訊PAGE FAULTS:頁錯誤SOURCE:源碼函數名與行號(極客級調試)SWAPS:交換分區計數Sending data、Copying to tmp table、Sorting result。sort_buffer_size)前後對比 Profile 輸出。Profile 是 MySQL 官方提供的、無需第三方工具的輕量級性能顯微鏡,掌握它能讓你從「感覺慢」進化到「知道哪裡慢、為什麼慢、怎麼改」。