SHOW PROFILE [type [, type] ... ]
[FOR QUERY n]
[LIMIT row_count [OFFSET offset]]
type: {
ALL
| BLOCK IO
| CONTEXT SWITCHES
| CPU
| IPC
| MEMORY
| PAGE FAULTS
| SOURCE
| SWAPS
}
SHOW PROFILE
和 SHOW PROFILES
陳述式會顯示效能分析資訊,指出目前工作階段期間執行的陳述式所使用的資源。
SHOW PROFILE
和 SHOW PROFILES
陳述式已被棄用;預計在未來的 MySQL 版本中移除。請改用 Performance Schema;請參閱第 29.19.1 節,「使用 Performance Schema 進行查詢效能分析」。
若要控制效能分析,請使用 profiling
工作階段變數,其預設值為 0 (OFF
)。將 profiling
設定為 1 或 ON
即可啟用效能分析。
mysql> SET profiling = 1;
SHOW PROFILES
會顯示傳送至伺服器的最近語句清單。清單的大小由 profiling_history_size
工作階段變數控制,其預設值為 15。最大值為 100。將此值設定為 0 實際上會停用效能分析。
除了 SHOW PROFILE
和 SHOW PROFILES
之外,所有語句都會進行效能分析,因此這兩個語句都不會出現在效能分析清單中。格式錯誤的語句也會進行效能分析。例如,SHOW PROFILING
是一個不合法的語句,如果您嘗試執行它,會發生語法錯誤,但它會出現在效能分析清單中。
SHOW PROFILE
會顯示有關單一語句的詳細資訊。如果沒有 FOR QUERY
子句,則輸出會與最近執行的語句相關。如果包含 n
FOR QUERY
,則 n
SHOW PROFILE
會顯示語句 n
的資訊。n
的值對應於 SHOW PROFILES
顯示的 Query_ID
值。
可以指定 LIMIT
子句,將輸出限制為 row_count
row_count
列。如果給定 LIMIT
,則可以新增 OFFSET
,以從完整列集合中的 offset
offset
列開始輸出。
預設情況下,SHOW PROFILE
會顯示 Status
和 Duration
資料行。Status
值類似於 SHOW PROCESSLIST
顯示的 State
值,儘管對於某些狀態值,兩個語句的解釋可能存在一些細微差異 (請參閱第 10.14 節,「檢查伺服器執行緒 (處理程序) 資訊」)。
可以指定選用的 type
值來顯示特定類型的其他資訊。
ALL
會顯示所有資訊BLOCK IO
會顯示區塊輸入和輸出作業的計數CONTEXT SWITCHES
會顯示自願和非自願內容切換的計數CPU
會顯示使用者和系統 CPU 使用時間IPC
會顯示已傳送和接收訊息的計數MEMORY
目前未實作PAGE FAULTS
會顯示主要和次要分頁錯誤的計數SOURCE
會顯示來源程式碼中的函數名稱,以及函數所在檔案的名稱和行號SWAPS
會顯示交換計數
效能分析是針對每個工作階段啟用的。當工作階段結束時,其效能分析資訊會遺失。
mysql> SELECT @@profiling;
+-------------+
| @@profiling |
+-------------+
| 0 |
+-------------+
1 row in set (0.00 sec)
mysql> SET profiling = 1;
Query OK, 0 rows affected (0.00 sec)
mysql> DROP TABLE IF EXISTS t1;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> CREATE TABLE T1 (id INT);
Query OK, 0 rows affected (0.01 sec)
mysql> SHOW PROFILES;
+----------+----------+--------------------------+
| Query_ID | Duration | Query |
+----------+----------+--------------------------+
| 0 | 0.000088 | SET PROFILING = 1 |
| 1 | 0.000136 | DROP TABLE IF EXISTS t1 |
| 2 | 0.011947 | CREATE TABLE t1 (id INT) |
+----------+----------+--------------------------+
3 rows in set (0.00 sec)
mysql> SHOW PROFILE;
+----------------------+----------+
| Status | Duration |
+----------------------+----------+
| checking permissions | 0.000040 |
| creating table | 0.000056 |
| After create | 0.011363 |
| query end | 0.000375 |
| freeing items | 0.000089 |
| logging slow query | 0.000019 |
| cleaning up | 0.000005 |
+----------------------+----------+
7 rows in set (0.00 sec)
mysql> SHOW PROFILE FOR QUERY 1;
+--------------------+----------+
| Status | Duration |
+--------------------+----------+
| query end | 0.000107 |
| freeing items | 0.000008 |
| logging slow query | 0.000015 |
| cleaning up | 0.000006 |
+--------------------+----------+
4 rows in set (0.00 sec)
mysql> SHOW PROFILE CPU FOR QUERY 2;
+----------------------+----------+----------+------------+
| Status | Duration | CPU_user | CPU_system |
+----------------------+----------+----------+------------+
| checking permissions | 0.000040 | 0.000038 | 0.000002 |
| creating table | 0.000056 | 0.000028 | 0.000028 |
| After create | 0.011363 | 0.000217 | 0.001571 |
| query end | 0.000375 | 0.000013 | 0.000028 |
| freeing items | 0.000089 | 0.000010 | 0.000014 |
| logging slow query | 0.000019 | 0.000009 | 0.000010 |
| cleaning up | 0.000005 | 0.000003 | 0.000002 |
+----------------------+----------+----------+------------+
7 rows in set (0.00 sec)
效能分析在某些架構上僅部分運作。對於取決於 getrusage()
系統呼叫的值,在不支援該呼叫的系統 (例如 Windows) 上會傳回 NULL
。此外,效能分析是針對每個處理程序而非針對每個執行緒。這表示伺服器中您自己以外的執行緒活動可能會影響您看到的計時資訊。
也可以從 INFORMATION_SCHEMA
PROFILING
表格取得效能分析資訊。請參閱 第 28.3.24 節,「INFORMATION_SCHEMA PROFILING 表格」。例如,下列查詢是相等的:
SHOW PROFILE FOR QUERY 2;
SELECT STATE, FORMAT(DURATION, 6) AS DURATION
FROM INFORMATION_SCHEMA.PROFILING
WHERE QUERY_ID = 2 ORDER BY SEQ;