このセクションでは、その使用方法を示す例によって、パフォーマンススキーマについて簡単に紹介します。 追加の例については、セクション27.19「問題を診断するためのパフォーマンススキーマの使用」を参照してください。
パフォーマンススキーマはデフォルトで有効になっています。 それを明示的に有効または無効にするには、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
ステートメントからの出力に一覧表示されます:
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
データベースに格納されます。 このデータベースとそのテーブルの構造に関する情報を取得するには、ほかのすべてのデータベースのように、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 |
| memory_summary_by_account_by_event_name |
| memory_summary_by_host_by_event_name |
| memory_summary_by_thread_by_event_name |
| memory_summary_by_user_by_event_name |
| memory_summary_global_by_event_name |
| metadata_locks |
| mutex_instances |
| objects_summary_global_by_type |
| performance_timers |
| replication_connection_configuration |
| replication_connection_status |
| replication_applier_configuration |
| replication_applier_status |
| replication_applier_status_by_coordinator |
| replication_applier_status_by_worker |
| rwlock_instances |
| session_account_connect_attrs |
| session_connect_attrs |
| setup_actors |
| setup_consumers |
| setup_instruments |
| setup_objects |
| socket_instances |
| socket_summary_by_event_name |
| socket_summary_by_instance |
| table_handles |
| 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 performance_schema.setup_consumers\G
*************************** 1. row ***************************
Table: setup_consumers
Create Table: CREATE TABLE `setup_consumers` (
`NAME` varchar(64) NOT NULL,
`ENABLED` enum('YES','NO') NOT NULL,
PRIMARY KEY (`NAME`)
) ENGINE=PERFORMANCE_SCHEMA DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
テーブル構造は、INFORMATION_SCHEMA.COLUMNS
などのテーブルから選択するか、SHOW COLUMNS
などのステートメントを使用して取得することもできます。
performance_schema
データベース内のテーブルはそれらの中の情報の種類 (現在のイベント、イベント履歴およびサマリー、オブジェクトインスタンス、およびセットアップ (構成) 情報) に従ってグループ化できます。 次の例に、これらのテーブルのいくつかの使用方法を示します。 各グループのテーブルに関する詳細については、セクション27.12「パフォーマンススキーマテーブルの説明」を参照してください。
最初に、すべてのインストゥルメントとコンシューマが有効にされていないため、パフォーマンススキーマはすべてのイベントを収集しません。 これらのすべてをオンにし、イベントタイミングを有効にするには、2 つのステートメントを実行します (行のカウントは MySQL バージョンによって異なることがあります)。
mysql> UPDATE performance_schema.setup_instruments
SET ENABLED = 'YES', TIMED = 'YES';
Query OK, 560 rows affected (0.04 sec)
mysql> UPDATE performance_schema.setup_consumers
SET ENABLED = 'YES';
Query OK, 10 rows affected (0.00 sec)
現在サーバーが何を行なっているかを確認するには、events_waits_current
テーブルを調査します。 それには、スレッドごとに、各スレッドの最新のモニターされたイベントを示す 1 行が含まれます。
mysql> SELECT *
FROM performance_schema.events_waits_current\G
*************************** 1. row ***************************
THREAD_ID: 0
EVENT_ID: 5523
END_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
INDEX_NAME: NULL
OBJECT_TYPE: NULL
OBJECT_INSTANCE_BEGIN: 142270668
NESTING_EVENT_ID: NULL
NESTING_EVENT_TYPE: NULL
OPERATION: lock
NUMBER_OF_BYTES: NULL
FLAGS: 0
...
このイベントは、スレッド 0 が THR_LOCK::mutex
のロック、mysys
サブシステム内の相互排他ロックを獲得するために、86,526 ピコ秒待機していたことを示しています。 最初のいくつかのカラムは次の情報を提供します。
ID カラムはイベントの発生元のスレッドとイベント番号を示します。
EVENT_NAME
はインストゥルメントされたものを示し、SOURCE
は、インストゥルメントされたコードを含むソースファイルを示します。タイマーカラムはイベントが開始および停止したタイミングとそれにかかった時間を示します。 イベントがまだ進行中の場合は、
TIMER_END
とTIMER_WAIT
の値がNULL
になります。 タイマー値は概算で、ピコ秒で表されます。 タイマーおよびイベント時間コレクションについては、セクション27.4.1「パフォーマンススキーマイベントタイミング」を参照してください。
履歴テーブルには、現在のイベントテーブルと同じ種類の行が含まれますが、ほかの行もあり、サーバーが「現在」ではなく、「最近」何を実行していたかが示されます。 events_waits_history
および events_waits_history_long
テーブルにはスレッドごとに最新の 10 イベントと最新の 10,000 イベントがそれぞれ含まれます。 たとえば、スレッド 13 によって生成された最新イベントの情報を表示するには、次を実行します。
mysql> SELECT EVENT_ID, EVENT_NAME, TIMER_WAIT
FROM performance_schema.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 performance_schema.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 performance_schema.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 performance_schema.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_instruments
では、イベントを収集できるインストゥルメントのセットがリストされ、有効になっているインストゥルメントが表示されます:
mysql> SELECT NAME, ENABLED, TIMED
FROM performance_schema.setup_instruments;
+---------------------------------------------------+---------+-------+
| NAME | ENABLED | TIMED |
+---------------------------------------------------+---------+-------+
...
| stage/sql/end | NO | NO |
| stage/sql/executing | NO | NO |
| stage/sql/init | NO | NO |
| stage/sql/insert | NO | NO |
...
| statement/sql/load | YES | YES |
| statement/sql/grant | YES | YES |
| statement/sql/check | YES | YES |
| statement/sql/flush | YES | YES |
...
| 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 |
...
インストゥルメント名の解釈方法を理解するには、セクション27.6「パフォーマンススキーマインストゥルメント命名規則」を参照してください。
インストゥルメントのイベントを収集するかどうかを制御するには、その ENABLED
値を YES
または NO
に設定します。 例:
mysql> UPDATE performance_schema.setup_instruments
SET ENABLED = 'NO'
WHERE NAME = 'wait/synch/mutex/sql/LOCK_mysql_create_db';
パフォーマンススキーマは収集されたイベントを使用して、イベント情報の「コンシューマ」として機能する performance_schema
データベース内のテーブルを更新します。 setup_consumers
テーブルは、使用可能なコンシューマとどれが有効にされているかを示します。
mysql> SELECT * FROM performance_schema.setup_consumers;
+----------------------------------+---------+
| NAME | ENABLED |
+----------------------------------+---------+
| events_stages_current | NO |
| events_stages_history | NO |
| events_stages_history_long | NO |
| events_statements_current | YES |
| events_statements_history | YES |
| events_statements_history_long | NO |
| events_transactions_current | YES |
| events_transactions_history | YES |
| events_transactions_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
値を設定します。
セットアップテーブルについてとそれらを使用して、イベント収集を制御する詳細については、セクション27.4.2「パフォーマンススキーマイベントフィルタリング」を参照してください。
先述のグループのいずれにも分類されないその他のテーブルがいくつかあります。 たとえば、performance_timers
は、使用可能なイベントタイマーとそれらの特性を一覧表示します。 タイマーの詳細については、セクション27.4.1「パフォーマンススキーマイベントタイミング」を参照してください。