SHOW PROFILE / SHOW PROFILES 是 MySQL 內建的會話級性能剖析工具,能展示一條 SQL 在各執行階段 (Parsing、Optimizing、Executing、Sending data 等) 的耗時、CPU、IO、上下文切換、頁錯誤等資源消耗,比 EXPLAIN 更貼近實際執行。
-- 1. 查看狀態 (預設關閉)
SHOW VARIABLES LIKE '%profiling%';
-- 2. 開啟
SET profiling = 1;
-- 3. 執行目標 SQL
SELECT goods_name FROM ecs_goods WHERE goods_id < 5000;
-- 4. 列出最近查詢 ID
SHOW PROFILES;
-- 5. 查看指定 Query ID 詳細剖析
SHOW PROFILE FOR QUERY 4;
-- 6. 可選:查看特定資源類型
SHOW PROFILE CPU, BLOCK IO, CONTEXT SWITCHES FOR QUERY 4;
| 欄位 | 說明 |
|---|---|
| Status | 執行階段 (starting, checking permissions, Opening tables, init, System lock, optimizing, statistics, preparing, executing, Sending data, end, query end, closing tables, freeing items, cleaning up) |
| Duration | 該階段耗時 (秒) |
| CPU_user / CPU_system | 用戶態/內核態 CPU 時間 |
| Context_voluntary / Context_involuntary | 自願/非自願上下文切換次數 |
| Block_ops_in / Block_ops_out | 塊設備讀/寫次數 |
| Messages_sent / Messages_received | 客戶端/服務端通信次數 |
| Page_faults_major / minor | 缺頁中斷次數 |
| Swaps | 交換分區讀寫次數 |
| Source_function / Source_file / Source_line | 對應 MySQL 源碼函數/文件/行號 (需 debug build) |
ANALYZE TABLE、增大 table_open_cache。tmp_table_size/max_heap_table_size、優化 SQL 避免臨時表。PERFORMANCE_SCHEMA (events_statements_history_long、events_stages_history_long) 或 sys.schema 視圖。-- 開啟消耗統計 (預設部分關閉)
UPDATE performance_schema.setup_instruments SET ENABLED='YES', TIMED='YES' WHERE NAME LIKE '%stage/%';
UPDATE performance_schema.setup_consumers SET ENABLED='YES' WHERE NAME LIKE '%events_stages%';
-- 查詢歷史階段耗時
SELECT EVENT_NAME, TIMER_WAIT/1000000000 AS duration_sec
FROM performance_schema.events_stages_history_long
WHERE THREAD_ID = (SELECT THREAD_ID FROM performance_schema.threads WHERE PROCESSLIST_ID = CONNECTION_ID())
ORDER BY EVENT_ID;
Profiling 是「顯微鏡」,適合單條 SQL 深度剖析;Performance Schema 是「體檢報告」,適合全庫持續觀測。兩者互補。