MySQL 8.0 リファレンスマニュアル


13.7.7.30 SHOW PROFILE ステートメント

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 を使用します。セクション27.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 は、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 PROFILEStatus および Duration カラムを表示します。 この Status 値は SHOW PROCESSLIST によって表示される State 値に似ていますが、一部のステータス値では、この 2 つのステートメントの解釈にわずかな違いがいくつか存在する可能性があります (セクション8.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_SCHEMAPROFILING テーブルからも入手できます。 セクション26.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;

関連キーワード:  ステートメント, CREATE, TABLE, DROP, 表示, サブクエリー, 情報, 関数, FUNCTION, SLAVE