Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 27.1Mb
PDF (A4) - 27.2Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


MySQL 5.6 リファレンスマニュアル  /  MySQL パフォーマンススキーマ  /  パフォーマンススキーマクイックスタート

22.1 パフォーマンススキーマクイックスタート

このセクションでは、その使用方法を示す例によって、パフォーマンススキーマについて簡単に紹介します。追加の例については、セクション22.15「問題を診断するためのパフォーマンススキーマの使用」を参照してください。

パフォーマンススキーマを使用できるようにするには、MySQL の構築時にそのサポートが構成されている必要があります。これが当てはまるかどうかは、サーバーのヘルプ出力をチェックして確認できます。パフォーマンススキーマを使用できる場合、出力に、performance_schema で始まる名前の付いたいくつかの変数が示されます。

shell> mysqld --verbose --help
...
  --performance_schema
                      Enable the performance schema.
  --performance_schema_events_waits_history_long_size=#
                      Number of rows in events_waits_history_long.
...

そのような変数が出力に表示されない場合、サーバーはパフォーマンススキーマをサポートするように構築されていません。この場合は、セクション22.2「パフォーマンススキーマ構成」を参照してください。

パフォーマンススキーマを使用できるものとして、MySQL 5.6.6 以降、それはデフォルトで有効にされます。5.6.6 より前では、それはデフォルトで無効にされます。それを明示的に有効または無効にするには、performance_schema 変数を適切な値に設定して、サーバーを起動します。たとえば、my.cnf ファイルでこれらの行を使用します。

[mysqld]
performance_schema=on

サーバーは起動すると、performance_schema を確認し、パフォーマンススキーマの初期化を試みます。初期化の成功を確認するには、このステートメントを使用します。

mysql> SHOW VARIABLES LIKE 'performance_schema';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| performance_schema | ON    |
+--------------------+-------+

ON の値はパフォーマンススキーマが正常に初期化され、使用する準備ができていることを意味します。OFF の値は何らかのエラーが発生していることを意味します。何に異常が発生したかに関する情報については、サーバーエラーログをチェックしてください。

パフォーマンススキーマはストレージエンジンとして実装されます。このエンジンを使用できる場合 (先にすでにチェックしているはずです)、INFORMATION_SCHEMA.ENGINES テーブルまたは SHOW ENGINES ステートメントからの出力に、SUPPORT 値が YES でそれが表示されていることでわかるはずです。

mysql> SELECT * FROM INFORMATION_SCHEMA.ENGINES
    -> WHERE ENGINE='PERFORMANCE_SCHEMA'\G
*************************** 1. row ***************************
      ENGINE: PERFORMANCE_SCHEMA
     SUPPORT: YES
     COMMENT: Performance Schema
TRANSACTIONS: NO
          XA: NO
  SAVEPOINTS: NO

mysql> SHOW ENGINES\G
...
      Engine: PERFORMANCE_SCHEMA
     Support: YES
     Comment: Performance Schema
Transactions: NO
          XA: NO
  Savepoints: NO
...

PERFORMANCE_SCHEMA ストレージエンジンは、performance_schema データベース内のテーブルを操作します。そのテーブルへの参照をデータベース名で修飾する必要がないように、performance_schema をデフォルトのデータベースにすることができます。

mysql> USE performance_schema;

この章の多くの例では、performance_schema がデフォルトのデータベースであるとしています。

パフォーマンススキーマテーブルは performance_schema データベースに格納されます。このデータベースとそのテーブルの構造に関する情報を取得するには、ほかのすべてのデータベースのように、INFORMATION_SCHEMA データベースから選択するか、SHOW ステートメントを使用します。たとえば、どのパフォーマンススキーマテーブルが存在するか確認するには、これらのいずれかのステートメントを使用します。

mysql> SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
    -> WHERE TABLE_SCHEMA = 'performance_schema';
+----------------------------------------------------+
| TABLE_NAME                                         |
+----------------------------------------------------+
| accounts                                           |
| cond_instances                                     |
| events_stages_current                              |
| events_stages_history                              |
| events_stages_history_long                         |
| events_stages_summary_by_account_by_event_name     |
| events_stages_summary_by_host_by_event_name        |
| events_stages_summary_by_thread_by_event_name      |
| events_stages_summary_by_user_by_event_name        |
| events_stages_summary_global_by_event_name         |
| events_statements_current                          |
| events_statements_history                          |
| events_statements_history_long                     |
...
| file_instances                                     |
| file_summary_by_event_name                         |
| file_summary_by_instance                           |
| host_cache                                         |
| hosts                                              |
| mutex_instances                                    |
| objects_summary_global_by_type                     |
| performance_timers                                 |
| rwlock_instances                                   |
| session_account_connect_attrs                      |
| session_connect_attrs                              |
| setup_actors                                       |
| setup_consumers                                    |
| setup_instruments                                  |
| setup_objects                                      |
| setup_timers                                       |
| socket_instances                                   |
| socket_summary_by_event_name                       |
| socket_summary_by_instance                         |
| table_io_waits_summary_by_index_usage              |
| table_io_waits_summary_by_table                    |
| table_lock_waits_summary_by_table                  |
| threads                                            |
| users                                              |
+----------------------------------------------------+

mysql> SHOW TABLES FROM performance_schema;
+----------------------------------------------------+
| Tables_in_performance_schema                       |
+----------------------------------------------------+
| accounts                                           |
| cond_instances                                     |
| events_stages_current                              |
| events_stages_history                              |
| events_stages_history_long                         |
...

パフォーマンススキーマテーブルの数は、追加のインストゥルメンテーションの実装が進行するにつれて、時間とともに増加することが予想されます。

performance_schema データベースの名前は小文字で、その中のテーブルの名前も同様です。クエリーでは名前を小文字で指定してください。

個々のテーブルの構造を表示するには、SHOW CREATE TABLE を使用します。

mysql> SHOW CREATE TABLE setup_timers\G
*************************** 1. row ***************************
       Table: setup_timers
Create Table: CREATE TABLE `setup_timers` (
  `NAME` varchar(64) NOT NULL,
  `TIMER_NAME` enum('CYCLE','NANOSECOND','MICROSECOND','MILLISECOND','TICK')
   NOT NULL
) ENGINE=PERFORMANCE_SCHEMA DEFAULT CHARSET=utf8

テーブル構造は、INFORMATION_SCHEMA.COLUMNS などのテーブルから選択するか、SHOW COLUMNS などのステートメントを使用して取得することもできます。

performance_schema データベース内のテーブルはそれらの中の情報の種類 (現在のイベント、イベント履歴およびサマリー、オブジェクトインスタンス、およびセットアップ (構成) 情報) に従ってグループ化できます。次の例に、これらのテーブルのいくつかの使用方法を示します。各グループのテーブルに関する詳細については、セクション22.9「パフォーマンススキーマテーブルの説明」を参照してください。

最初に、すべてのインストゥルメントとコンシューマが有効にされていないため、パフォーマンススキーマはすべてのイベントを収集しません。これらのすべてをオンにし、イベントタイミングを有効にするには、2 つのステートメントを実行します (行のカウントは MySQL バージョンによって異なることがあります)。

mysql> UPDATE setup_instruments SET ENABLED = 'YES', TIMED = 'YES';
Query OK, 338 rows affected (0.12 sec)
mysql> UPDATE setup_consumers SET ENABLED = 'YES';
Query OK, 8 rows affected (0.00 sec)

現在サーバーが何を行なっているかを確認するには、events_waits_current テーブルを調査します。それには、スレッドごとに、各スレッドの最新のモニターされたイベントを示す 1 行が含まれます。

mysql> SELECT * FROM events_waits_current\G
*************************** 1. row ***************************
            THREAD_ID: 0
             EVENT_ID: 5523
           EVENT_NAME: wait/synch/mutex/mysys/THR_LOCK::mutex
               SOURCE: thr_lock.c:525
          TIMER_START: 201660494489586
            TIMER_END: 201660494576112
           TIMER_WAIT: 86526
                SPINS: NULL
        OBJECT_SCHEMA: NULL
          OBJECT_NAME: NULL
          OBJECT_TYPE: NULL
OBJECT_INSTANCE_BEGIN: 142270668
     NESTING_EVENT_ID: NULL
            OPERATION: lock
      NUMBER_OF_BYTES: NULL
                FLAGS: 0
...

このイベントは、スレッド 0 が THR_LOCK::mutex のロック、mysys サブシステム内の相互排他ロックを獲得するために、86,526 ピコ秒待機していたことを示しています。最初のいくつかのカラムは次の情報を提供します。

  • ID カラムはイベントの発生元のスレッドとイベント番号を示します。

  • EVENT_NAME はインストゥルメントされたものを示し、SOURCE は、インストゥルメントされたコードを含むソースファイルを示します。

  • タイマーカラムはイベントが開始および停止したタイミングとそれにかかった時間を示します。イベントがまだ進行中の場合は、TIMER_ENDTIMER_WAIT の値が NULL になります。タイマー値は概算で、ピコ秒で表されます。タイマーおよびイベント時間コレクションについては、セクション22.2.3.1「パフォーマンススキーマイベントタイミング」を参照してください。

履歴テーブルには、現在のイベントテーブルと同じ種類の行が含まれますが、ほかの行もあり、サーバーが現在ではなく、最近何を実行していたかが示されます。events_waits_history および events_waits_history_long テーブルにはスレッドごとに最新の 10 イベントと最新の 10,000 イベントがそれぞれ含まれます。たとえば、スレッド 13 によって生成された最新イベントの情報を表示するには、次を実行します。

mysql> SELECT EVENT_ID, EVENT_NAME, TIMER_WAIT
    -> FROM events_waits_history WHERE THREAD_ID = 13
    -> ORDER BY EVENT_ID;
+----------+-----------------------------------------+------------+
| EVENT_ID | EVENT_NAME                              | TIMER_WAIT |
+----------+-----------------------------------------+------------+
|       86 | wait/synch/mutex/mysys/THR_LOCK::mutex  |     686322 |
|       87 | wait/synch/mutex/mysys/THR_LOCK_malloc  |     320535 |
|       88 | wait/synch/mutex/mysys/THR_LOCK_malloc  |     339390 |
|       89 | wait/synch/mutex/mysys/THR_LOCK_malloc  |     377100 |
|       90 | wait/synch/mutex/sql/LOCK_plugin        |     614673 |
|       91 | wait/synch/mutex/sql/LOCK_open          |     659925 |
|       92 | wait/synch/mutex/sql/THD::LOCK_thd_data |     494001 |
|       93 | wait/synch/mutex/mysys/THR_LOCK_malloc  |     222489 |
|       94 | wait/synch/mutex/mysys/THR_LOCK_malloc  |     214947 |
|       95 | wait/synch/mutex/mysys/LOCK_alarm       |     312993 |
+----------+-----------------------------------------+------------+

履歴テーブルに新しいイベントが追加されると、テーブルがいっぱいである場合、古いイベントが破棄されます。

サマリーテーブルは、時間をかけてすべてのイベントについて集計された情報を提供します。このグループのテーブルには、さまざまな方法で、イベントデータが要約されます。もっとも多くの回数実行されたか、またはもっとも待機時間がかかったインストゥルメントを確認するには、COUNT_STAR または SUM_TIMER_WAIT カラムで events_waits_summary_global_by_event_name テーブルをソートします。これらのカラムはすべてのイベント全体で計算された、COUNT(*) または SUM(TIMER_WAIT) 値にそれぞれ対応します。

mysql> SELECT EVENT_NAME, COUNT_STAR
    -> FROM events_waits_summary_global_by_event_name
    -> ORDER BY COUNT_STAR DESC LIMIT 10;
+---------------------------------------------------+------------+
| EVENT_NAME                                        | COUNT_STAR |
+---------------------------------------------------+------------+
| wait/synch/mutex/mysys/THR_LOCK_malloc            |       6419 |
| wait/io/file/sql/FRM                              |        452 |
| wait/synch/mutex/sql/LOCK_plugin                  |        337 |
| wait/synch/mutex/mysys/THR_LOCK_open              |        187 |
| wait/synch/mutex/mysys/LOCK_alarm                 |        147 |
| wait/synch/mutex/sql/THD::LOCK_thd_data           |        115 |
| wait/io/file/myisam/kfile                         |        102 |
| wait/synch/mutex/sql/LOCK_global_system_variables |         89 |
| wait/synch/mutex/mysys/THR_LOCK::mutex            |         89 |
| wait/synch/mutex/sql/LOCK_open                    |         88 |
+---------------------------------------------------+------------+

mysql> SELECT EVENT_NAME, SUM_TIMER_WAIT
    -> FROM events_waits_summary_global_by_event_name
    -> ORDER BY SUM_TIMER_WAIT DESC LIMIT 10;
+----------------------------------------+----------------+
| EVENT_NAME                             | SUM_TIMER_WAIT |
+----------------------------------------+----------------+
| wait/io/file/sql/MYSQL_LOG             |     1599816582 |
| wait/synch/mutex/mysys/THR_LOCK_malloc |     1530083250 |
| wait/io/file/sql/binlog_index          |     1385291934 |
| wait/io/file/sql/FRM                   |     1292823243 |
| wait/io/file/myisam/kfile              |      411193611 |
| wait/io/file/myisam/dfile              |      322401645 |
| wait/synch/mutex/mysys/LOCK_alarm      |      145126935 |
| wait/io/file/sql/casetest              |      104324715 |
| wait/synch/mutex/sql/LOCK_plugin       |       86027823 |
| wait/io/file/sql/pid                   |       72591750 |
+----------------------------------------+----------------+

これらの結果には、THR_LOCK_malloc 相互排他ロックが、その使用される頻度とスレッドがそれを獲得しようとして待機する時間の量の両方に関して、ホットであることが示されます。

注記

THR_LOCK_malloc 相互排他ロックはデバッグビルドでのみ使用されます。本番ビルドでは、それが存在しないため、ホットではありません。

インスタンステーブルは、インストゥルメントされたオブジェクトの種類を記述します。インストゥルメントされたオブジェクトは、サーバーによって使われると、イベントを生成します。これらのテーブルは、イベント名と説明のメモまたはステータス情報を提供します。たとえば、file_instances テーブルは、ファイル I/O 操作のインストゥルメントのインスタンスとそれらに関連付けられたファイルを一覧表示します。

mysql> SELECT * FROM file_instances\G
*************************** 1. row ***************************
 FILE_NAME: /opt/mysql-log/60500/binlog.000007
EVENT_NAME: wait/io/file/sql/binlog
OPEN_COUNT: 0
*************************** 2. row ***************************
 FILE_NAME: /opt/mysql/60500/data/mysql/tables_priv.MYI
EVENT_NAME: wait/io/file/myisam/kfile
OPEN_COUNT: 1
*************************** 3. row ***************************
 FILE_NAME: /opt/mysql/60500/data/mysql/columns_priv.MYI
EVENT_NAME: wait/io/file/myisam/kfile
OPEN_COUNT: 1
...

セットアップテーブルは、モニタリング特性の構成と表示に使われます。たとえば、選択されているイベントタイマーを表示するには、setup_timers テーブルをクエリーします。

mysql> SELECT * FROM setup_timers;
+-----------+-------------+
| NAME      | TIMER_NAME  |
+-----------+-------------+
| idle      | MICROSECOND |
| wait      | CYCLE       |
| stage     | NANOSECOND  |
| statement | NANOSECOND  |
+-----------+-------------+

setup_instruments は、イベントを収集できる一連のインストゥルメントを一覧表示し、それらのうちどれが有効にされているかを示します。

mysql> SELECT * FROM setup_instruments;
+------------------------------------------------------------+---------+-------+
| NAME                                                       | ENABLED | TIMED |
+------------------------------------------------------------+---------+-------+
...
| wait/synch/mutex/sql/LOCK_global_read_lock                 | YES     | YES   |
| wait/synch/mutex/sql/LOCK_global_system_variables          | YES     | YES   |
| wait/synch/mutex/sql/LOCK_lock_db                          | YES     | YES   |
| wait/synch/mutex/sql/LOCK_manager                          | YES     | YES   |
...
| wait/synch/rwlock/sql/LOCK_grant                           | YES     | YES   |
| wait/synch/rwlock/sql/LOGGER::LOCK_logger                  | YES     | YES   |
| wait/synch/rwlock/sql/LOCK_sys_init_connect                | YES     | YES   |
| wait/synch/rwlock/sql/LOCK_sys_init_slave                  | YES     | YES   |
...
| wait/io/file/sql/binlog                                    | YES     | YES   |
| wait/io/file/sql/binlog_index                              | YES     | YES   |
| wait/io/file/sql/casetest                                  | YES     | YES   |
| wait/io/file/sql/dbopt                                     | YES     | YES   |
...

インストゥルメント名の解釈方法を理解するには、セクション22.4「パフォーマンススキーマインストゥルメント命名規則」を参照してください。

インストゥルメントのイベントを収集するかどうかを制御するには、その ENABLED 値を YES または NO に設定します。例:

mysql> UPDATE setup_instruments SET ENABLED = 'NO'
    -> WHERE NAME = 'wait/synch/mutex/sql/LOCK_mysql_create_db';

パフォーマンススキーマは収集されたイベントを使用して、イベント情報のコンシューマとして機能する performance_schema データベース内のテーブルを更新します。setup_consumers テーブルは、使用可能なコンシューマとどれが有効にされているかを示します。

mysql> SELECT * FROM setup_consumers;
+--------------------------------+---------+
| NAME                           | ENABLED |
+--------------------------------+---------+
| events_stages_current          | NO      |
| events_stages_history          | NO      |
| events_stages_history_long     | NO      |
| events_statements_current      | YES     |
| events_statements_history      | NO      |
| events_statements_history_long | NO      |
| events_waits_current           | NO      |
| events_waits_history           | NO      |
| events_waits_history_long      | NO      |
| global_instrumentation         | YES     |
| thread_instrumentation         | YES     |
| statements_digest              | YES     |
+--------------------------------+---------+

パフォーマンススキーマがコンシューマをイベント情報の宛先として保守するかどうかを制御するには、その ENABLED 値を設定します。

セットアップテーブルについてとそれらを使用して、イベント収集を制御する詳細については、セクション22.2.3.2「パフォーマンススキーマイベントフィルタリング」を参照してください。

先述のグループのいずれにも分類されないその他のテーブルがいくつかあります。たとえば、performance_timers は、使用可能なイベントタイマーとそれらの特性を一覧表示します。タイマーの詳細については、セクション22.2.3.1「パフォーマンススキーマイベントタイミング」を参照してください。


User Comments
Sign Up Login You must be logged in to post a comment.