MySQL 5.0.37+ 引入 Query Profiler,可獲取 SQL 各階段耗時、CPU/上下文切換、IPC、頁錯誤、源碼函數調用等微觀指標,遠超 EXPLAIN 的靜態分析。本文詳細講解啟用、查看、分析全流程。
SET profiling = 1; -- 會在 information_schema 建立 PROFILING 表
-- 或會話級
SET SESSION profiling = 1;
SHOW PROFILES;
+----------+------------+-------------------+
| Query_ID | Duration | Query |
+----------+------------+-------------------+
| 1 | 0.00090400 | SHOW PROFILE... |
| 2 | 0.00008700 | SELECT * FROM users|
| 3 | 0.00183800 | SHOW TABLES |
+----------+------------+-------------------+
SELECT SUM(duration) FROM information_schema.profiling WHERE query_id = 2;
SHOW PROFILE FOR QUERY 2;
+----------------------+----------+
| Status | Duration |
+----------------------+----------+
| starting | 0.000063 |
| checking permissions | 0.000014 |
| Opening tables | 0.000014 |
| System lock | 0.000006 |
| Table lock | 0.000010 |
| init | 0.000022 |
| optimizing | 0.000011 |
| statistics | 0.000093 |
| preparing | 0.000017 |
| executing | 0.000007 |
| Sending data | 0.000168 |
| end | 0.000007 |
| query end | 0.000005 |
| freeing items | 0.000012 |
| closing tables | 0.000008 |
| logging slow query | 0.000004 |
+----------------------+----------+
關鍵階段: Sending data 通常佔比最高(含數據傳輸、磁盤讀取、鎖等待)。
SHOW PROFILE CPU FOR QUERY 2;
+----------------------+----------+----------+------------+
| Status | Duration | CPU_user | CPU_system |
+----------------------+----------+----------+------------+
| Sending data | 0.015072 | 0.011998 | 0.000000 |
...
SHOW PROFILE IPC FOR QUERY 2;
SHOW PROFILE SOURCE FOR QUERY 2;
+----------------------+----------+-------------------------+
| Status | Duration | Source |
+----------------------+----------+-------------------------+
| executing | 0.000007 | sql_executor.cc:123 |
| Sending data | 0.015072 | protocol.cc:456 |
...
| 類型 | 指標 |
|---|---|
| ALL | 所有信息 |
| BLOCK IO | 磁盤讀寫塊計數 |
| CONTEXT SWITCHES | 自願/非自願上下文切換 |
| CPU | 用戶/系統 CPU 時間 |
| IPC | 消息發送/接收計數 |
| MEMORY | 未實現 |
| PAGE FAULTS | 缺頁中斷計數 |
| SOURCE | 源碼函數、文件、行號 |
| SWAPS | 交換分區計數 |
-- 歷史記錄條數 (默認 15)
SHOW VARIABLES LIKE 'profiling_history_size';
SET profiling_history_size = 100;
-- 關閉
SET profiling = 0;
Duration 最高?Sending data 高 → 磁盤 IO/鎖/大結果集;optimizing 高 → 複雜 JOIN/子查詢;statistics 高 → 統計信息不準。CPU 高 → 計算密集(複雜表達式、加密);BLOCK IO 高 → 磁盤瓶頸;CONTEXT SWITCHES 高 → 鎖競爭/高併發。SOURCE 定位熱點函數,結合源碼或官方文檔理解內部行為。| 維度 | EXPLAIN | PROFILING |
|---|---|---|
| 類型 | 靜態估算 | 動態實測 |
| 粒度 | 查詢級 | 階段級 (微秒) |
| 資源可見性 | 無 | CPU/IO/鎖/上下文切換 |
| 適用場景 | 索引選擇、連接順序 | 深度性能調優、異常排查 |