MySQL Profiling 使用指南
SHOW PROFILE 是會話級性能分析工具,能精確拆解單條 Query 的資源消耗:CPU、IO、上下文切換、頁錯誤、鎖等待等,定位瓶頸利器。
啟用與基本流程
-- 1. 開啟 profiling(會話級,重連失效)
SET profiling = 1;
-- 2. 執行目標查詢
SELECT * FROM large_table WHERE created_at > '2024-01-01';
-- 3. 查看所有已記錄查詢摘要
SHOW PROFILES;
+----------+------------+-----------------------------------+
| Query_ID | Duration | Query |
+----------+------------+-----------------------------------+
| 1 | 0.00123456 | SELECT * FROM large_table ... |
+----------+------------+-----------------------------------+
-- 4. 針對單個 Query 詳細分析
SHOW PROFILE ALL FOR QUERY 1;
-- 或指定類型
SHOW PROFILE CPU, BLOCK IO FOR QUERY 1;
Profile 類型詳解
| 類型 | 含義 | 關注場景 |
ALL | 所有開銷 | 全面排查 |
BLOCK IO | 塊設備讀寫 | 磁盤 IO 瓶頸 |
CONTEXT SWITCHES | 自願/非自願上下文切換 | 併發爭用、鎖競爭 |
CPU | 用戶/系統 CPU 時間 | 計算密集型查詢 |
IPC | 進程間通信發送接收 | 分佈式/多實例 |
MEMORY | 內存使用(未實現) | — |
PAGE FAULTS | 缺頁中斷 | 內存壓力、緩存未命中 |
SOURCE | 源碼函數/文件/行號 | 內核級調試 |
SWAPS | 交換次數 | 內存不足換出 |
實戰輸出解讀範例
SHOW PROFILE CPU, BLOCK IO FOR QUERY 1;
+----------------------+----------+----------+------------+--------------+---------------+
| Status | Duration | CPU_user | CPU_system | Block_ops_in | Block_ops_out |
+----------------------+----------+----------+------------+--------------+---------------+
| starting | 0.000050 | 0.000000 | 0.000000 | 0 | 0 |
| checking permissions | 0.000010 | 0.000000 | 0.000000 | 0 | 0 |
| Opening tables | 0.000020 | 0.000000 | 0.000000 | 0 | 0 |
| System lock | 0.000015 | 0.000000 | 0.000000 | 0 | 0 |
| Table lock | 0.000030 | 0.000000 | 0.000000 | 0 | 0 |
| init | 0.000025 | 0.000000 | 0.000000 | 0 | 0 |
| optimizing | 0.000015 | 0.000000 | 0.000000 | 0 | 0 |
| statistics | 0.000020 | 0.000000 | 0.000000 | 0 | 0 |
| preparing | 0.000015 | 0.000000 | 0.000000 | 0 | 0 |
| executing | 0.000010 | 0.000000 | 0.000000 | 0 | 0 |
| Sending data | 0.001000 | 0.000800 | 0.000100 | 120 | 0 |
| end | 0.000005 | 0.000000 | 0.000000 | 0 | 0 |
| query end | 0.000005 | 0.000000 | 0.000000 | 0 | 0 |
| closing tables | 0.000010 | 0.000000 | 0.000000 | 0 | 0 |
| freeing items | 0.000010 | 0.000000 | 0.000000 | 0 | 0 |
| cleaning up | 0.000005 | 0.000000 | 0.000000 | 0 | 0 |
+----------------------+----------+----------+------------+--------------+---------------+
關鍵洞察
- Sending data 階段:耗時 1ms,CPU 0.9ms,
Block_ops_in=120 → 磁盤讀取為主要瓶頸
- 若
CPU_user 佔比極高 → 複雜計算/函數/排序,考慮索引優化或下推計算
- 若
Context_switches 高 → 鎖爭用/併發過大,檢查隔離級別/索引減少掃描行
- 若
Page_faults 高 → 內存不足,增加 innodb_buffer_pool_size
進階用法
-- 限制輸出行數
SHOW PROFILE ALL FOR QUERY 1 LIMIT 5 OFFSET 2;
-- 從 INFORMATION_SCHEMA 查詢(可跨會話持久化分析)
SELECT * FROM INFORMATION_SCHEMA.PROFILING WHERE QUERY_ID = 1;
局限性與替代方案
| 局限 | 說明 | 替代 |
| 會話級、不持久 | 重連失效,不適合生產持續監控 | Performance Schema (5.6+)、sys schema |
| 有性能開銷 | 啟用後所有查詢額外記錄 | 僅調試時開啟 |
| 不支持並發查詢聚合 | 單條查詢視角 | pt-query-digest 分析慢查詢日誌 |
| 5.7 棄用,8.0 移除 | 完全由 Performance Schema 取代 | 學習 events_statements_history_long 等表 |
最佳實踐建議
- 結合
EXPLAIN 使用:EXPLAIN 看執行計劃,PROFILE 看實際資源消耗
- 對比優化前後:同一查詢優化前後 PROFILE 對比,量化效果
- 關注
Sending data、Waiting for table lock、Sorting result 等高耗時階段
- 生產環境改用
Performance Schema + sys.schema 做持續觀測
- 上一篇文章: Windows 7 安裝 Python MySQLdb 模塊完整避坑指南
- 下一篇文章: MySQL 觸發器實時同步到 SQL Server:異構數據庫同步實戰方案
Copyright ©
程式碼之家 All Rights Reserved