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
ステートメントは、現在のセッションの過程で実行されたステートメントのリソース使用状況を示すプロファイリング情報を表示します。
これらのステートメントは、MySQL 5.6.7 の時点では非推奨であり、将来の MySQL リリースで削除される予定です。代わりに、パフォーマンススキーマを使用してください。第22章「MySQL パフォーマンススキーマ」を参照してください。
プロファイリングは、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
は、1 つのステートメントに関する詳細情報を表示します。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
値に似ていますが、一部のステータス値では、この 2 つのステートメントの解釈にわずかな違いがいくつか存在する可能性があります (セクション8.12.5「スレッド情報の検査」を参照してください)。
オプションの 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
テーブルからも取得できます。セクション21.16「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;