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


MySQL 8.0 リファレンスマニュアル  /  ...  /  パフォーマンススキーマを使用したクエリープロファイリング

27.19.1 パフォーマンススキーマを使用したクエリープロファイリング

次の例は、パフォーマンススキーマのステートメントイベントとステージイベントを使用して、SHOW PROFILES および SHOW PROFILE ステートメントによって提供されるプロファイリング情報と同等のデータを取得する方法を示しています。

setup_actors テーブルを使用すると、ホスト、ユーザーまたはアカウントごとに履歴イベントの収集を制限して、実行時のオーバーヘッドおよび履歴テーブルに収集されるデータ量を減らすことができます。 例の最初のステップは、履歴イベントの収集を特定のユーザーに制限する方法を示しています。

パフォーマンススキーマは、タイミングデータを標準単位に正規化するために、イベントタイマー情報をピコ秒 (1 秒に 1 兆) で表示します。 次の例では、TIMER_WAIT 値を 1000000000000 で除算して、データを秒単位で表示します。 また、値は小数点以下 6 桁に切り捨てられ、SHOW PROFILES および SHOW PROFILE ステートメントと同じ形式でデータが表示されます。

  1. 履歴イベントの収集を、クエリーを実行するユーザーに制限します。 デフォルトでは、setup_actors は、すべてのフォアグラウンドスレッドのモニタリングおよび履歴イベント収集を許可するように構成されています:

    mysql> SELECT * FROM performance_schema.setup_actors;
    +------+------+------+---------+---------+
    | HOST | USER | ROLE | ENABLED | HISTORY |
    +------+------+------+---------+---------+
    | %    | %    | %    | YES     | YES     |
    +------+------+------+---------+---------+

    setup_actors テーブルのデフォルト行を更新して、すべてのフォアグラウンドスレッドの履歴イベント収集および監視を無効にし、クエリーを実行するユーザーの監視および履歴イベント収集を有効にする新しい行を挿入します:

    mysql> UPDATE performance_schema.setup_actors
           SET ENABLED = 'NO', HISTORY = 'NO'
           WHERE HOST = '%' AND USER = '%';
    
    mysql> INSERT INTO performance_schema.setup_actors
           (HOST,USER,ROLE,ENABLED,HISTORY)
           VALUES('localhost','test_user','%','YES','YES');

    これで、setup_actors テーブルのデータは次のようになります:

    mysql> SELECT * FROM performance_schema.setup_actors;
    +-----------+-----------+------+---------+---------+
    | HOST      | USER      | ROLE | ENABLED | HISTORY |
    +-----------+-----------+------+---------+---------+
    | %         | %         | %    | NO      | NO      |
    | localhost | test_user | %    | YES     | YES     |
    +-----------+-----------+------+---------+---------+
  2. setup_instruments テーブルを更新して、ステートメントおよびステージインストゥルメンテーションが有効になっていることを確認します。 一部のインストゥルメントは、デフォルトですでに有効になっている場合があります。

    mysql> UPDATE performance_schema.setup_instruments
           SET ENABLED = 'YES', TIMED = 'YES'
           WHERE NAME LIKE '%statement/%';
    
    mysql> UPDATE performance_schema.setup_instruments
           SET ENABLED = 'YES', TIMED = 'YES'
           WHERE NAME LIKE '%stage/%';
  3. events_statements_* および events_stages_* コンシューマが有効になっていることを確認します。 一部のコンシューマは、デフォルトですでに有効になっている場合があります。

    mysql> UPDATE performance_schema.setup_consumers
           SET ENABLED = 'YES'
           WHERE NAME LIKE '%events_statements_%';
    
    mysql> UPDATE performance_schema.setup_consumers
           SET ENABLED = 'YES'
           WHERE NAME LIKE '%events_stages_%';
  4. 監視しているユーザーアカウントで、プロファイリングするステートメントを実行します。 例:

    mysql> SELECT * FROM employees.employees WHERE emp_no = 10001;
    +--------+------------+------------+-----------+--------+------------+
    | emp_no | birth_date | first_name | last_name | gender | hire_date |
    +--------+------------+------------+-----------+--------+------------+
    |  10001 | 1953-09-02 | Georgi     | Facello   | M      | 1986-06-26 |
    +--------+------------+------------+-----------+--------+------------+
  5. events_statements_history_long テーブルをクエリーして、ステートメントの EVENT_ID を識別します。 このステップは、Query_ID を識別するための SHOW PROFILES の実行に似ています。 次のクエリーでは、SHOW PROFILES のような出力が生成されます:

    mysql> SELECT EVENT_ID, TRUNCATE(TIMER_WAIT/1000000000000,6) as Duration, SQL_TEXT
           FROM performance_schema.events_statements_history_long WHERE SQL_TEXT like '%10001%';
    +----------+----------+--------------------------------------------------------+
    | event_id | duration | sql_text                                               |
    +----------+----------+--------------------------------------------------------+
    |       31 | 0.028310 | SELECT * FROM employees.employees WHERE emp_no = 10001 |
    +----------+----------+--------------------------------------------------------+
  6. events_stages_history_long テーブルをクエリーして、ステートメントステージイベントを取得します。 ステージは、イベントネストを使用してステートメントにリンクされます。 各ステージイベントレコードには、親ステートメントの EVENT_ID を含む NESTING_EVENT_ID カラムがあります。

    mysql> SELECT event_name AS Stage, TRUNCATE(TIMER_WAIT/1000000000000,6) AS Duration
           FROM performance_schema.events_stages_history_long WHERE NESTING_EVENT_ID=31;
    +--------------------------------+----------+
    | Stage                          | Duration |
    +--------------------------------+----------+
    | stage/sql/starting             | 0.000080 |
    | stage/sql/checking permissions | 0.000005 |
    | stage/sql/Opening tables       | 0.027759 |
    | stage/sql/init                 | 0.000052 |
    | stage/sql/System lock          | 0.000009 |
    | stage/sql/optimizing           | 0.000006 |
    | stage/sql/statistics           | 0.000082 |
    | stage/sql/preparing            | 0.000008 |
    | stage/sql/executing            | 0.000000 |
    | stage/sql/Sending data         | 0.000017 |
    | stage/sql/end                  | 0.000001 |
    | stage/sql/query end            | 0.000004 |
    | stage/sql/closing tables       | 0.000006 |
    | stage/sql/freeing items        | 0.000272 |
    | stage/sql/cleaning up          | 0.000001 |
    +--------------------------------+----------+

関連キーワード:  テーブル, パフォーマンス, スキーマ, events, stage, イベント, ステートメント, history, setup, replication