首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL Query Profiler 實戰:SQL 執行時間、CPU/內存、鎖等待全維度分析

     編輯:MySQL 資料庫相關知識

MySQL Query Profiler:從 EXPLAIN 到微秒級性能剖析

MySQL 5.0.37+ 引入 Query Profiler,可獲取 SQL 各階段耗時、CPU/上下文切換、IPC、頁錯誤、源碼函數調用等微觀指標,遠超 EXPLAIN 的靜態分析。本文詳細講解啟用、查看、分析全流程。

一、啟用 Profiling


SET profiling = 1;  -- 會在 information_schema 建立 PROFILING 表
-- 或會話級
SET SESSION profiling = 1;

二、查看已執行語句概覽


SHOW PROFILES;
+----------+------------+-------------------+
| Query_ID | Duration   | Query             |
+----------+------------+-------------------+
| 1        | 0.00090400 | SHOW PROFILE...   |
| 2        | 0.00008700 | SELECT * FROM users|
| 3        | 0.00183800 | SHOW TABLES       |
+----------+------------+-------------------+

三、深度剖析單條查詢

1. 總耗時


SELECT SUM(duration) FROM information_schema.profiling WHERE query_id = 2;

2. 各階段耗時


SHOW PROFILE FOR QUERY 2;
+----------------------+----------+
| Status               | Duration |
+----------------------+----------+
| starting             | 0.000063 |
| checking permissions | 0.000014 |
| Opening tables       | 0.000014 |
| System lock          | 0.000006 |
| Table lock           | 0.000010 |
| init                 | 0.000022 |
| optimizing           | 0.000011 |
| statistics           | 0.000093 |
| preparing            | 0.000017 |
| executing            | 0.000007 |
| Sending data         | 0.000168 |
| end                  | 0.000007 |
| query end            | 0.000005 |
| freeing items        | 0.000012 |
| closing tables       | 0.000008 |
| logging slow query   | 0.000004 |
+----------------------+----------+

關鍵階段: Sending data 通常佔比最高(含數據傳輸、磁盤讀取、鎖等待)。

3. CPU 使用情況


SHOW PROFILE CPU FOR QUERY 2;
+----------------------+----------+----------+------------+
| Status               | Duration | CPU_user | CPU_system |
+----------------------+----------+----------+------------+
| Sending data         | 0.015072 | 0.011998 | 0.000000   |
...

4. IPC 通信(消息收發)


SHOW PROFILE IPC FOR QUERY 2;

5. 源碼函數調用堆棧


SHOW PROFILE SOURCE FOR QUERY 2;
+----------------------+----------+-------------------------+
| Status               | Duration | Source                  |
+----------------------+----------+-------------------------+
| executing            | 0.000007 | sql_executor.cc:123     |
| Sending data         | 0.015072 | protocol.cc:456         |
...

四、可用分析類型

類型指標
ALL所有信息
BLOCK IO磁盤讀寫塊計數
CONTEXT SWITCHES自願/非自願上下文切換
CPU用戶/系統 CPU 時間
IPC消息發送/接收計數
MEMORY未實現
PAGE FAULTS缺頁中斷計數
SOURCE源碼函數、文件、行號
SWAPS交換分區計數

五、配置與關閉


-- 歷史記錄條數 (默認 15)
SHOW VARIABLES LIKE 'profiling_history_size';
SET profiling_history_size = 100;

-- 關閉
SET profiling = 0;

六、實戰分析三步法

  1. 瓶頸定位:哪個階段 Duration 最高?Sending data 高 → 磁盤 IO/鎖/大結果集;optimizing 高 → 複雜 JOIN/子查詢;statistics 高 → 統計信息不準。
  2. 資源關聯:CPU 高 → 計算密集(複雜表達式、加密);BLOCK IO 高 → 磁盤瓶頸;CONTEXT SWITCHES 高 → 鎖競爭/高併發。
  3. 源碼追踪:SOURCE 定位熱點函數,結合源碼或官方文檔理解內部行為。

七、對比:EXPLAIN vs PROFILING

維度EXPLAINPROFILING
類型靜態估算動態實測
粒度查詢級階段級 (微秒)
資源可見性無CPU/IO/鎖/上下文切換
適用場景索引選擇、連接順序深度性能調優、異常排查
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved