網站變慢時,SQL 效能往往是核心瓶頸。準確測量單條 SQL 的執行耗時、各階段耗時分佈,是優化的前提。MySQL 提供 SHOW PROFILE(Session 級、階段級)與手動 TIMESTAMPDIFF(簡易測量)兩種方式。本文詳細演示兩種方法的開啟、使用、輸出解讀與避坑指南。
-- 查看狀態
SHOW VARIABLES LIKE 'profiling%';
-- profiling=OFF, profiling_history_size=15
-- 開啟(Session 級,斷開連線失效)
SET profiling = 1;
SHOW TABLES;
SELECT * FROM aa;
UPDATE aa SET name='d';
DELETE FROM bb;
SHOW PROFILES;
+----------+------------+------------------------+
| Query_ID | Duration | Query |
+----------+------------+------------------------+
| 1 | 0.00054775 | SHOW TABLES |
| 2 | 0.00022400 | SELECT * FROM aa |
| 3 | 0.00026275 | UPDATE aa SET name='d' |
| 4 | 0.00043000 | DELETE FROM bb |
+----------+------------+------------------------+
SHOW PROFILE FOR QUERY 3;
+----------------------+-----------+
| Status | Duration |
+----------------------+-----------+
| starting | 0.0000475 |
| checking permissions | 0.0000077 |
| Opening tables | 0.000026 |
| System lock | 0.0000042 |
| Table lock | 0.0000045 |
| init | 0.0000205 |
| Updating | 0.0000787 |
| end | 0.0000567 |
| query end | 0.000004 |
| freeing items | 0.0000067 |
| closing tables | 0.000004 |
| logging slow query | 0.000002 |
+----------------------+-----------+
-- CPU、Block IO、Context Switches、Page Faults 等
SHOW PROFILE CPU, BLOCK IO FOR QUERY 3;
Performance Schema(events_statements_history_long)。profiling_history_size。利用用戶變數記錄開始時間,緊接執行目標 SQL,再計算差值。
SET @start = NOW(6); -- 微秒精度
SELECT * FROM comment WHERE id < 10000;
SELECT TIMESTAMPDIFF(MICROSECOND, @start, NOW(6)) AS elapsed_us;
-- 測試不同 LIMIT 的查詢耗時
SET @sql = 'SELECT * FROM t_order WHERE user_id=1001 ORDER BY create_time DESC LIMIT ?';
PREPARE stmt FROM @sql;
SET @lim = 10; SET @s = NOW(6); EXECUTE stmt USING @lim; SELECT TIMESTAMPDIFF(MICROSECOND, @s, NOW(6));
SET @lim = 100; SET @s = NOW(6); EXECUTE stmt USING @lim; SELECT TIMESTAMPDIFF(MICROSECOND, @s, NOW(6));
SET @lim = 1000; SET @s = NOW(6); EXECUTE stmt USING @lim; SELECT TIMESTAMPDIFF(MICROSECOND, @s, NOW(6));
DEALLOCATE PREPARE stmt;
NOW(6) 獲得微秒精度(MySQL 5.6.4+)。| 工具 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| Performance Schema | 生產級、零侵入、歷史保留、多維度聚合 | 配置複雜、佔用記憶體 | 線上全量 SQL 監控、Top SQL 發現 |
| Slow Query Log | 簡單、持久化、可離線分析 | 只記錄超閾值 SQL、無階段細分 | 日常慢查詢收集、pt-query-digest 分析 |
| EXPLAIN ANALYZE (8.0.18+) | 真實執行計劃、每算子實際行數/耗時 | 需執行 SQL、僅單條分析 | 深度調優單條複雜查詢 |
SHOW PROFILE 適合開發/測試環境快速定位單條 SQL 熱點階段;TIMESTAMPDIFF 適合無權限、臨時對比場景。生產環境**請依賴 Performance Schema + Slow Query Log + pt-query-digest** 建立常態化 SQL 效能監控體系。工具只是手段,**讀懂 EXPLAIN、建立正確索引、改寫惡臭 SQL** 才是優化本質。