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 版本中移除。請改用 效能綱要;請參閱第 29.19.1 節,「使用效能綱要進行查詢分析」。
若要控制分析,請使用 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;