このページは機械翻訳したものです。
このセクションでは、その使用方法を示す例によって、パフォーマンススキーマについて簡単に紹介します。 追加の例については、セクション27.19「問題を診断するためのパフォーマンススキーマの使用」を参照してください。
パフォーマンススキーマはデフォルトで有効になっています。 それを明示的に有効または無効にするには、performance_schema
変数を適切な値に設定して、サーバーを起動します。 たとえば、サーバー my.cnf
ファイルで次の行を使用します:
Press CTRL+C to copy[mysqld] performance_schema=ON
サーバーは起動すると、performance_schema
を確認し、パフォーマンススキーマの初期化を試みます。 初期化の成功を確認するには、このステートメントを使用します。
Press CTRL+C to copymysql> SHOW VARIABLES LIKE 'performance_schema'; +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | performance_schema | ON | +--------------------+-------+
ON
の値はパフォーマンススキーマが正常に初期化され、使用する準備ができていることを意味します。 OFF
の値は何らかのエラーが発生していることを意味します。 何に異常が発生したかに関する情報については、サーバーエラーログをチェックしてください。
パフォーマンススキーマはストレージエンジンとして実装されるため、INFORMATION_SCHEMA.ENGINES
テーブルまたは SHOW ENGINES
ステートメントからの出力に一覧表示されます:
Press CTRL+C to copymysql> 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
をデフォルトのデータベースにすることができます。
Press CTRL+C to copymysql> USE performance_schema;
パフォーマンススキーマテーブルは performance_schema
データベースに格納されます。 このデータベースとそのテーブルの構造に関する情報を取得するには、ほかのすべてのデータベースのように、INFORMATION_SCHEMA
データベースから選択するか、SHOW
ステートメントを使用します。 たとえば、どのパフォーマンススキーマテーブルが存在するか確認するには、これらのいずれかのステートメントを使用します。
Press CTRL+C to copymysql> 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
を使用します。
Press CTRL+C to copymysql> 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 バージョンによって異なることがあります)。
Press CTRL+C to copymysql> 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 行が含まれます。
Press CTRL+C to copymysql> 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 によって生成された最新イベントの情報を表示するには、次を実行します。
Press CTRL+C to copymysql> 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)
値にそれぞれ対応します。
Press CTRL+C to copymysql> 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 操作のインストゥルメントのインスタンスとそれらに関連付けられたファイルを一覧表示します。
Press CTRL+C to copymysql> 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
では、イベントを収集できるインストゥルメントのセットがリストされ、有効になっているインストゥルメントが表示されます:
Press CTRL+C to copymysql> 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
に設定します。 例:
Press CTRL+C to copymysql> UPDATE performance_schema.setup_instruments SET ENABLED = 'NO' WHERE NAME = 'wait/synch/mutex/sql/LOCK_mysql_create_db';
パフォーマンススキーマは収集されたイベントを使用して、イベント情報の「コンシューマ」として機能する performance_schema
データベース内のテーブルを更新します。 setup_consumers
テーブルは、使用可能なコンシューマとどれが有効にされているかを示します。
Press CTRL+C to copymysql> 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「パフォーマンススキーマイベントタイミング」を参照してください。