首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 性能調優利器:SHOW PROFILE 詳細使用指南

     編輯:MySQL 綜合教學

MySQL SHOW PROFILE:SQL 執行性能剖析神器

MySQL 5.0+ 引入的 SHOW PROFILE 類似 Oracle 10046 事件,能將 SQL 執行過程拆解為細粒度的狀態步驟,展示每步的持續時間、CPU 消耗、上下文切換、I/O 等指標,是定位慢查詢瓶頸的利器。

1. 啟用 Profiling

SELECT @@profiling;  -- 查看當前狀態(0=關閉)
SET profiling = 1;   -- 開啟,當前會話生效

注意:Profiling 已在 MySQL 5.6.7 起標記為廢棄,8.0 移除。新版建議使用 Performance Schema 或 EXPLAIN ANALYZE。

2. 執行目標 SQL

SELECT COUNT(1) FROM test1 t1, test2 t2;

3. 查看 Profiling 結果

SHOW PROFILE CPU, BLOCK IO FOR QUERY 1;

FOR QUERY n 指定第 n 條執行的語句(從 1 開始)。常用 type 組合:

  • ALL:所有可用指標
  • CPU:用戶/系統 CPU 時間
  • BLOCK IO:磁塊讀寫次數
  • CONTEXT SWITCHES:上下文切換次數
  • SOURCE:源碼函數名與行號(調試內核用)

4. 輸出解讀示例

+--------------------------------+----------+-----------+------------+--------------+---------------+
| Status                         | Duration | CPU_user  | CPU_system | Block_ops_in | Block_ops_out |
+--------------------------------+----------+-----------+------------+--------------+---------------+
| starting                       | 0.000006 | 0.000000  | 0.000000   | NULL         | NULL          |
| checking query cache for query | 0.000023 | 0.000000  | 0.000000   | NULL         | NULL          |
| Opening tables                 | 0.000026 | 0.000000  | 0.000000   | NULL         | NULL          |
| optimizing                     | 0.000004 | 0.000000  | 0.000000   | NULL         | NULL          |
| statistics                     | 0.000012 | 0.000000  | 0.000000   | NULL         | NULL          |
| preparing                      | 0.000022 | 0.000000  | 0.000000   | NULL         | NULL          |
| executing                      | 0.000002 | 0.000000  | 0.000000   | NULL         | NULL          |
| Sending data                   | 0.388263 | 0.375000  | 0.000000   | NULL         | NULL          |  <-- 核心耗時
| end                            | 0.000017 | 0.000000  | 0.000000   | NULL         | NULL          |
| query end                      | 0.000008 | 0.000000  | 0.000000   | NULL         | NULL          |
| closing tables                 | 0.000014 | 0.000000  | 0.000000   | NULL         | NULL          |
| freeing items                  | 0.000006 | 0.000000  | 0.000000   | NULL         | NULL          |
| cleaning up                    | 0.000015 | 0.000000  | 0.000000   | NULL         | NULL          |
+--------------------------------+----------+-----------+------------+--------------+---------------+

重點關注 Duration 最大的階段(如 Sending data、Copying to tmp table、Sorting result),結合 CPU/BLOCK IO 判斷是計算密集還是 I/O 密集。

5. 進階用法

  • SHOW PROFILES:列出當前會話所有已記錄語句的 Query_ID 與耗時摘要。
  • LIMIT row_count OFFSET offset:分頁顯示剖析明細。
  • 對比不同 SQL(如 Join 順序、索引有無)的 Profile 差異,量化優化效果。

6. 遷移建議

MySQL 8.0+ 請使用:

  • EXPLAIN ANALYZE SELECT ...:獲取實際執行計劃與每算子耗時。
  • Performance Schema 表 events_statements_history_long 等進行歷史分析。
  • sys.schema 視圖 statement_analysis 等聚合報表。

總結

SHOW PROFILE 為舊版本提供了極低門檻的 SQL 級性能剖析能力,掌握其輸出含義能快速定位「慢在哪兒」。新版本請轉向 Performance Schema 與 EXPLAIN ANALYZE 獲得更豐富、持久化的觀測數據。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved