MySQL Profiling 可顯示 SQL 執行全過程中各階段的資源消耗(CPU、I/O、鎖等待、網路等),是診斷慢查詢、定位效能瓶頸的利器。
-- 檢查狀態(0=關閉, 1=開啟)
SELECT @@profiling;
-- 開啟(Session 級別)
SET profiling = 1;
-- 驗證
SELECT @@profiling; -- 應回傳 1
注意:Profiling 僅支援 Session 級別,SET GLOBAL profiling=1 會報錯;重新連線後自動重置為關閉。
USE backup;
CREATE TABLE t5 AS SELECT * FROM t1;
SELECT COUNT(*) FROM t5;
SELECT COUNT(*) FROM t5; -- 第二次有查詢緩存
SHOW PROFILES;
-- 輸出所有已記錄查詢的 Query_ID、Duration、SQL 文本
SHOW PROFILE FOR QUERY 7; -- 針對特定 Query_ID 顯示詳細階段耗時
| Status | 說明 |
|---|---|
| starting / initialization | 查詢初始化 |
| Opening tables | 打開資料表 |
| System lock / Table lock | 系統/表鎖等待 |
| init | 初始化查詢結構 |
| optimizing | 優化器生成執行計劃 |
| executing | 執行查詢(核心階段) |
| end / query end | 結束處理 |
| freeing items / closing tables | 釋放資源、關閉表 |
| logging slow query | 寫入慢查詢日誌 |
SELECT SUM(DURATION) FROM INFORMATION_SCHEMA.PROFILING WHERE QUERY_ID = 7;
Opening tables 久 → 表太多 / executing 久 → 需優化索引)。EXPLAIN 與慢查詢日誌進行多維度調優。作者:skate | 日期:2012/02/17