MySQL 5.0.37(Community 版)引入 SHOW PROFILE / SHOW PROFILES,提供查詢級別的執行階段耗時、CPU、塊 I/O、記憶體、Swap、上下文切換、源碼行號等微觀指標,是 SQL 調優與內核行為分析的利器。
SHOW VARIABLES LIKE 'have_profiling'; 驗證)。profiling 為 Session 級變數,每新連線需重新 SET profiling = 1;。profiling_history_size。SET profiling = 1;
SELECT COUNT(*) FROM t; -- Query_ID = 1
INSERT INTO t SELECT * FROM t; -- Query_ID = 2
SHOW PROFILES; -- 列出所有已剖析查詢
SHOW PROFILE FOR QUERY 2; -- 基礎階段耗時
SHOW PROFILE CPU, BLOCK IO FOR QUERY 2; -- 含 CPU、磁塊 I/O
SHOW PROFILE CPU, BLOCK IO, MEMORY, SWAPS, CONTEXT SWITCHES, SOURCE FOR QUERY 2; -- 全維度
| 欄位 | 含義 | 調優關注點 |
|---|---|---|
Status | 執行階段(Sending data、Copying to tmp table、converting HEAP to MyISAM 等) | 佔比最高的階段即瓶頸 |
Duration | 該階段耗秒數 | 找最長者 |
CPU_user / CPU_system | 用戶態/核心態 CPU 秒數 | 高佔比 → 計算密集(複雜運算、排序、壓縮) |
Block_ops_in / out | 磁塊讀/寫次數 | 高 → I/O 瓶頸,檢查索引、緩衝池、磁碟 |
Context_voluntary / involuntary | 自願/非自願上下文切換 | 高非自願 → CPU 爭搶嚴重,檢查並發、鎖 |
Source_function / file / line | MySQL 源碼函數、檔案、行號 | 深入內核行為,開發者/核心貢獻者用 |
SELECT COUNT(*) FROM t(209 萬行)Sending data 耗時 0.747 秒,CPU_user 0.746 秒 → 純 CPU 計算密集(無索引掃描)。INSERT ... SELECT(209 萬行 → 34 秒)Copying to tmp table 1.26 秒、converting HEAP to MyISAM 0.38 秒、Copying to tmp table on disk 1.42 秒 → 臨時表溢寫磁碟 是關鍵瓶頸。Sending data 31 秒,CPU_user 13.9 秒 → 大量網路傳輸與行寫入。UPDATE t SET username='waill'(419 萬行 → 44.8 秒)Updating 階段 44.5 秒,CPU_user 27.9 秒、CPU_system 2.8 秒、Context_involuntary 1584 次 → 寫入鎖競爭、CPU 繁忙、上下文切換頻繁。Duration、Block_ops 變化。Copying to tmp table on disk → 檢查 tmp_table_size、max_heap_table_size、是否含 BLOB/TEXT、GROUP BY/ORDER BY 列超長。Context_involuntary + 高 System lock/Table lock → 檢查隔離級別、行鎖持有時間、長事務。PERFORMANCE_SCHEMA (5.5+) / sys schema (5.7+):Profile 適合單查詢深度剖析,P_S 適合全實例持續觀測。PERFORMANCE_SCHEMA + sys.schema 體系。