MySQL 5.0.37+ 內建 SHOW PROFILE 功能,可精確到微秒級拆解 SQL 執行全生命週期各階段耗時,是定位疑難慢查詢的利器。本文通過實例演示如何開啟、執行對比、解讀輸出,並說明查詢快取對二次執行的加速效果。
SELECT @@profiling; -- 0=關閉, 1=開啟
SET profiling = 1; -- 當前 Session 生效
SELECT @@profiling; -- 確認已開啟
-- 建表並寫入 57344 行
CREATE TABLE t_engines SELECT * FROM t_engines1;
-- 耗時 0.102 秒
-- 第一次 COUNT(*)
SELECT COUNT(*) FROM t_engines;
-- 耗時 0.00033 秒
-- 第二次 COUNT(*) (命中查詢快取)
SELECT COUNT(*) FROM t_engines;
-- 耗時 0.000039 秒
SHOW PROFILES;
-- 列出最近執行的語句及 Query_ID、總耗時
SHOW PROFILE FOR QUERY 27; -- 第一次 COUNT 詳細階段
SHOW PROFILE FOR QUERY 28; -- 第二次 COUNT 詳細階段
Status Duration
starting 0.000004
checking query cache 0.000041
checking permissions 0.000011
Opening tables 0.000183
System lock 0.000005
Table lock 0.000018
init 0.000011
optimizing 0.000006
executing 0.000028
end 0.000005
query end 0.000003
storing result in query cache 0.000004
freeing items 0.000004
closing tables 0.000005
logging slow query 0.000003
Total: ~0.000327 秒
Status Duration
starting 0.000004
checking query cache 0.000008
checking privileges on cached query 0.000005
checking permissions 0.000005
sending cached result to client 0.000013
logging slow query 0.000005
Total: ~0.000039 秒
Opening tables、Table lock、optimizing、executing 等階段,直接 sending cached result。Opening tables (56%)、checking query cache (12%)、Table lock (5%)。SELECT SUM(DURATION) FROM INFORMATION_SCHEMA.PROFILING WHERE QUERY_ID=27;SHOW PROFILE,建議改用 Performance Schema (events_statements_history_long) 獲得更豐富、持久化的分析數據。