パフォーマンススキーマのテーブル
MySQL 5.7 では performance_schema データベースに 87 個のテーブルが存在する。設定用のテーブルは 7 個、実質的に使用されていないものが 2 個あるので、それらを除けば、78 個のデータ収集用のテーブルが存在することになる。なお、これらのテーブルは TRUNCATE することでデータをリセットできるようになっている。
各種パフォーマンススキーマテーブルの概要
以下、どのようなテーブルがあるのか、大まかに記載をする。
イベントテーブル
各種コンシューマにより採取される _current 、_history 、_history_long で終わる名前のテーブルとなる。それぞれ、現在のイベント、スレッドごとの N 個の履歴、サーバー全体で N 個の履歴を保持するテーブルとなる。
mysql> SHOW TABLES FROM performance_schema LIKE "%_current";
+------------------------------------------+
| Tables_in_performance_schema (%_current) |
+------------------------------------------+
| events_stages_current |
| events_statements_current |
| events_transactions_current |
| events_waits_current |
+------------------------------------------+
4 rows in set (0.00 sec)
mysql> SHOW TABLES FROM performance_schema LIKE "%_history";
+------------------------------------------+
| Tables_in_performance_schema (%_history) |
+------------------------------------------+
| events_stages_history |
| events_statements_history |
| events_transactions_history |
| events_waits_history |
+------------------------------------------+
4 rows in set (0.00 sec)
mysql> SHOW TABLES FROM performance_schema LIKE "%_history_long";
+-----------------------------------------------+
| Tables_in_performance_schema (%_history_long) |
+-----------------------------------------------+
| events_stages_history_long |
| events_statements_history_long |
| events_transactions_history_long |
| events_waits_history_long |
+-----------------------------------------------+
4 rows in set (0.00 sec)
mysql> SELECT * FROM events_statements_history_long LIMIT 1 \G;
*************************** 1. row ***************************
THREAD_ID: 44
EVENT_ID: 180
END_EVENT_ID: 180
EVENT_NAME: statement/sql/update
SOURCE: socket_connection.cc:101
TIMER_START: 1097289933162056000
TIMER_END: 1097289933324910000
TIMER_WAIT: 162854000
LOCK_TIME: 96000000
SQL_TEXT: UPDATE setup_consumers SET ENABLED='YES' WHERE NAME LIKE 'events_statements%'
DIGEST: ea50ae0f50502c1e179b52f7db114f35
DIGEST_TEXT: UPDATE `setup_consumers` SET `ENABLED` = ? WHERE NAME LIKE ?
CURRENT_SCHEMA: performance_schema
OBJECT_TYPE: NULL
OBJECT_SCHEMA: NULL
OBJECT_NAME: NULL
OBJECT_INSTANCE_BEGIN: NULL
MYSQL_ERRNO: 0
RETURNED_SQLSTATE: 00000
MESSAGE_TEXT: Rows matched: 3 Changed: 1 Warnings: 0
ERRORS: 0
WARNINGS: 0
ROWS_AFFECTED: 1
ROWS_SENT: 0
ROWS_EXAMINED: 15
CREATED_TMP_DISK_TABLES: 0
CREATED_TMP_TABLES: 0
SELECT_FULL_JOIN: 0
SELECT_FULL_RANGE_JOIN: 0
SELECT_RANGE: 0
SELECT_RANGE_CHECK: 0
SELECT_SCAN: 0
SORT_MERGE_PASSES: 0
SORT_RANGE: 0
SORT_ROWS: 0
SORT_SCAN: 0
NO_INDEX_USED: 0
NO_GOOD_INDEX_USED: 0
NESTING_EVENT_ID: NULL
NESTING_EVENT_TYPE: NULL
NESTING_EVENT_LEVEL: 0
1 row in set (0.01 sec)
サマリーテーブル
サマリーテーブルは、種々の要素ごとに取得した統計データを格納したテーブルとなる。テーブル名に _summary がふくまれていることより判断が可能で、テーブル名から何によって集計したかがわかるようになっている。例えば events_waits_summary_by_account_by_event_name は、待ち状態についてアカウントごとイベント名ごとに集計したものとなる。MySQL のアカウントはユーザー名とホスト名の組み合わせなので、events_waits_summary_by_account_by_event_name に含まれるデータは、待ち状態の統計データを GROUP BY USER, HOST, EVENT_NAME 相当の処理を適用して集計したデータであると考えてよい。
events_statements_summary_by_digest はダイジェストごとに取得した行数や実行時間などを保持しており、遅いクエリを特定する際に役に立つ。
mysql> SELECT * FROM events_statements_summary_by_digest WHERE DIGEST = 'cacb423a8c7befe95454b5d7bb0cab67'\G;
*************************** 1. row ***************************
SCHEMA_NAME: performance_schema
DIGEST: cacb423a8c7befe95454b5d7bb0cab67
DIGEST_TEXT: UPDATE `world` . `City` SET NAME = ? WHERE `ID` = ?
COUNT_STAR: 1
SUM_TIMER_WAIT: 6376385000
MIN_TIMER_WAIT: 6376385000
AVG_TIMER_WAIT: 6376385000
MAX_TIMER_WAIT: 6376385000
SUM_LOCK_TIME: 113000000
SUM_ERRORS: 0
SUM_WARNINGS: 0
SUM_ROWS_AFFECTED: 1
SUM_ROWS_SENT: 0
SUM_ROWS_EXAMINED: 1
SUM_CREATED_TMP_DISK_TABLES: 0
SUM_CREATED_TMP_TABLES: 0
SUM_SELECT_FULL_JOIN: 0
SUM_SELECT_FULL_RANGE_JOIN: 0
SUM_SELECT_RANGE: 0
SUM_SELECT_RANGE_CHECK: 0
SUM_SELECT_SCAN: 0
SUM_SORT_MERGE_PASSES: 0
SUM_SORT_RANGE: 0
SUM_SORT_ROWS: 0
SUM_SORT_SCAN: 0
SUM_NO_INDEX_USED: 0
SUM_NO_GOOD_INDEX_USED: 0
FIRST_SEEN: 2018-08-21 02:16:08
LAST_SEEN: 2018-08-21 02:16:08
1 row in set (0.00 sec)
また、サマリーテーブルにはイベントテーブルと同じカテゴリ以外のテーブルも存在する。例えばテーブルごとにアクセス統計を表示する table_io_waits_summary_by_table 、ファイルごとに I/O の状況を集計する file_summary_by_instance テーブル、メモリの割り当て状況を追跡する memory_summary_global_by_event_name テーブル等がある。
mysql> SELECT * FROM table_io_waits_summary_by_table WHERE OBJECT_NAME = 'City'\G;
*************************** 1. row ***************************
OBJECT_TYPE: TABLE
OBJECT_SCHEMA: world
OBJECT_NAME: City
COUNT_STAR: 4082
SUM_TIMER_WAIT: 154124483943
MIN_TIMER_WAIT: 15756345
AVG_TIMER_WAIT: 37756848
MAX_TIMER_WAIT: 2403812763
COUNT_READ: 2
SUM_TIMER_READ: 2702039487
MIN_TIMER_READ: 435479355
AVG_TIMER_READ: 1351019535
MAX_TIMER_READ: 2266560132
COUNT_WRITE: 4080
SUM_TIMER_WRITE: 151422444456
MIN_TIMER_WRITE: 15756345
AVG_TIMER_WRITE: 37113000
MAX_TIMER_WRITE: 2403812763
COUNT_FETCH: 2
SUM_TIMER_FETCH: 2702039487
MIN_TIMER_FETCH: 435479355
AVG_TIMER_FETCH: 1351019535
MAX_TIMER_FETCH: 2266560132
COUNT_INSERT: 4079
SUM_TIMER_INSERT: 151380575988
MIN_TIMER_INSERT: 15756345
AVG_TIMER_INSERT: 37112166
MAX_TIMER_INSERT: 2403812763
COUNT_UPDATE: 1
SUM_TIMER_UPDATE: 41868468
MIN_TIMER_UPDATE: 41868468
AVG_TIMER_UPDATE: 41868468
MAX_TIMER_UPDATE: 41868468
COUNT_DELETE: 0
SUM_TIMER_DELETE: 0
MIN_TIMER_DELETE: 0
AVG_TIMER_DELETE: 0
MAX_TIMER_DELETE: 0
1 row in set (0.00 sec)
mysql> SELECT * FROM file_summary_by_instance WHERE FILE_NAME LIKE '/var/lib/mysql/sys/sys_config.ibd' \G;
*************************** 1. row ***************************
FILE_NAME: /var/lib/mysql/sys/sys_config.ibd
EVENT_NAME: wait/io/file/innodb/innodb_data_file
OBJECT_INSTANCE_BEGIN: 140647562436608
COUNT_STAR: 10
SUM_TIMER_WAIT: 92582757
MIN_TIMER_WAIT: 636759
AVG_TIMER_WAIT: 9258234
MAX_TIMER_WAIT: 29558628
COUNT_READ: 5
SUM_TIMER_READ: 64641672
MIN_TIMER_READ: 8524314
AVG_TIMER_READ: 12928251
MAX_TIMER_READ: 29558628
SUM_NUMBER_OF_BYTES_READ: 81920
COUNT_WRITE: 0
SUM_TIMER_WRITE: 0
MIN_TIMER_WRITE: 0
AVG_TIMER_WRITE: 0
MAX_TIMER_WRITE: 0
SUM_NUMBER_OF_BYTES_WRITE: 0
COUNT_MISC: 5
SUM_TIMER_MISC: 27941085
MIN_TIMER_MISC: 636759
AVG_TIMER_MISC: 5588217
MAX_TIMER_MISC: 16283016
1 row in set (0.00 sec)
mysql> SELECT * FROM memory_summary_global_by_event_name WHERE EVENT_NAME = 'memory/performance_schema/memory_summary_by_thread_by_event_name'\G;
*************************** 1. row ***************************
EVENT_NAME: memory/performance_schema/memory_summary_by_thread_by_event_name
COUNT_ALLOC: 1
COUNT_FREE: 0
SUM_NUMBER_OF_BYTES_ALLOC: 5898240
SUM_NUMBER_OF_BYTES_FREE: 0
LOW_COUNT_USED: 0
CURRENT_COUNT_USED: 1
HIGH_COUNT_USED: 1
LOW_NUMBER_OF_BYTES_USED: 0
CURRENT_NUMBER_OF_BYTES_USED: 5898240
HIGH_NUMBER_OF_BYTES_USED: 5898240
1 row in set (0.00 sec)
インスタンステーブル
ファイル名に _instance とうサフィックスを持つテーブルはインスタンステーブルと呼ばれる。インスタンスとは追跡中の計器のインスタンスを指す。例えばミューテックスであっても、サーバの初期化時に生成されサーバが終了するまで破棄されないものもあれば、テーブルなどのオブジェクトのライフサイクルに合わせて生成と破棄を繰り返すものもある。インスタンステーブルを見れば追跡中のインスタンスがどれだけ存在するかがわかる。
特にプリペアドステートメントのインスタンスを表示する prepared_statements_instances テーブルは、現時点でサーバ上に存在するプリペアドステートメントに解放忘れがないか、それによりメモリが無駄に消費されていないか、など角煮が可能となる。
mysql> SELECT * FROM prepared_statements_instances;
Empty set (0.00 sec)
ロックテーブル
metadata_locks と table_handles はテーブルごとのメタデータロックとテーブルロックを解析するのに役立つ。特に metadata_locks テーブルは FLUSH TABLES WITH READ LOCK により取得されるグローバルリードロックの情報を表示可能。
ステータス変数テーブル
SHOW GLOBAL STATUS コマンド等で表示される各種ステータス変数のデータをサーバー全体、現在のセッション、現在存在するスレッドごと、アカウントごと、ユーザーごと、ホストごとに表示できる。例えばアプリケーション、役割ごとにユーザーアカウントを分けている場合などに、どのアプリケーションが大きな負荷を発生させているかなどを解析できる。
mysql> SELECT * FROM status_by_thread LIMIT 10;
+-----------+-------------------------+----------------+
| THREAD_ID | VARIABLE_NAME | VARIABLE_VALUE |
+-----------+-------------------------+----------------+
| 45 | Bytes_received | 5904 |
| 45 | Bytes_sent | 603844 |
| 45 | Com_stmt_reprepare | 0 |
| 45 | Compression | OFF |
| 45 | Created_tmp_disk_tables | 0 |
| 45 | Created_tmp_tables | 9 |
| 45 | Handler_commit | 3 |
| 45 | Handler_delete | 0 |
| 45 | Handler_discover | 0 |
| 45 | Handler_external_lock | 69 |
+-----------+-------------------------+----------------+
10 rows in set (0.00 sec)
レプリケーション情報テーブル
MySQL 5.7 からはパフォーマンススキーマによりレプリケーションのステータスを取得できるようになっている。
mysql> SHOW TABLES FROM performance_schema LIKE 'replication%';
+---------------------------------------------+
| Tables_in_performance_schema (replication%) |
+---------------------------------------------+
| replication_applier_configuration |
| replication_applier_status |
| replication_applier_status_by_coordinator |
| replication_applier_status_by_worker |
| replication_connection_configuration |
| replication_connection_status |
| replication_group_member_stats |
| replication_group_members |
+---------------------------------------------+
8 rows in set (0.00 sec)
それぞれ以下の情報を取得可能。
- replication_applier_configuration: SQL スレッドの設定を表示する
- replication_applier_status_by_coordinator: コーディネータスレッドのステータスを表示する
- replication_applier_status_by_worker: ワーカースレッドのステータスを表示する
- replication_connection_configuration: IO スレッドの設定を表示する
- replication_connection_status: IO スレッドのステータスを表示する
- replication_group_member_stats: 将来のために予約されているテーブル。現在は利用されていない
- replication_group_members: 将来のために予約されているテーブル。現在は利用されていない