パフォーマンススキーマ ( 4 )

August 21, 2018

パフォーマンススキーマのテーブル

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: 将来のために予約されているテーブル。現在は利用されていない

 © 2023, Dealing with Ambiguity