MySQLを運用する中で、SYS Schemaを利用してインスタンスの状態を確認する事が増えていますが、Performance Schemaを直接見てSQL処理を確認するケースも相変わら多いか思います。まだ具体的にどの様に活用していくかは目途が付いていませんが、MySQL8.0.14のリリースノートに以下の様にSTATEMENT_IDが付与される様になったとの記載があったので念の為に概要だけ確認しておきます。
The Performance Schema statement event tables (events_statements_current, events_statements_history, and events_statements_history_long) now have a STATEMENT_ID column that indicates the query ID maintained by the server at the SQL level. Column values are unique for the server instance because they are generated using a global counter that is incremented atomically.
Changes in MySQL 8.0.14 (2019-01-21, General Availability)
WORKLOG
「STATEMENT_IDは、SQL レベルでサーバーによって保持されるクエリー IDで、これらの ID はアトミックに増分されるグローバルカウンタを使用して生成されるため、この値はサーバーインスタンスに対して一意です。 このカラムは、MySQL 8.0.14 で追加されました。」
WL#12165: PERFORMANCE_SCHEMA, CAPTURE QUERY_ID
events_statements_current | 各スレッド (スレッドごとに 1 行) の現在の監視対象イベントが格納されます。 現在のステートメントイベントが含まれます。 テーブルには、スレッドごとに最新のモニター対象ステートメントイベントの現在のステータスを示す 1 行が格納されるため、テーブルサイズを構成するためのシステム変数はありません。 TRUNCATE TABLE は テーブルに対して許可されていて行が削除されます。 |
events_statements_history | スレッドごとに終了した最新イベントが格納されます (スレッド当たりの最大行数まで) events_statements_history テーブルと events_statements_history_long テーブルは、終了した最新のステートメントイベントのコレクションで、スレッド当たりの最大行数まで、およびすべてのスレッドにわたってグローバルに終了します。 events_statements_history テーブルには、スレッドごとに終了した N の最新のステートメントイベントが含まれます。 ステートメントイベントは終了するまでテーブルに追加されません。 テーブルに特定のスレッドの最大行数が含まれている場合、そのスレッドの新しい行が追加されると、最も古いスレッド行は破棄されます。 スレッドが終了すると、そのすべての行が破棄されます。 ≒ スレッドが終了すると、そのすべての行は_history テーブルから破棄されますが、_history_long テーブルからは破棄されません。 パフォーマンススキーマは、サーバーの起動時に N の値を自動サイズ調整します。 スレッドごとの行数を明示的に設定するには、サーバーの起動時に performance_schema_events_statements_history_size システム変数を設定します。TRUNCATE TABLE は テーブルに対して許可されていて行が削除されます。 |
events_statements_history_long | グローバルに終了した最新イベントが格納されます (全てのスレッドで、テーブル当たりの最大行数まで)。 events_statements_history テーブルと events_statements_history_long テーブルは、終了した最新のステートメントイベントのコレクションで、スレッド当たりの最大行数まで、およびすべてのスレッドにわたってグローバルに終了します。 events_statements_history_long テーブルには、すべてのスレッドでグローバルに終了した N の最新のステートメントイベントが含まれます。 ステートメントイベントは終了するまでテーブルに追加されません。 テーブルがいっぱいになると、どちらのスレッドがどちらの行を生成したかに関係なく、新しい行が追加されたときにもっとも古い行が破棄されます。 N の値はサーバー起動時に自動サイズ設定されます。 テーブルサイズを明示的に設定するには、サーバー起動時に performance_schema_events_statements_history_long_size システム変数を設定します。 events_statements_history_long テーブルには、events_statements_current と同じカラムがあります。 TRUNCATE TABLE は テーブルに対して許可されていて行が削除されます。 |
STATEMENT_IDが追加されている。
Default設定HISTORY SIZE
mysql> show global variables like 'performance_schema_events_statements_history_size';
+---------------------------------------------------+-------+
| Variable_name | Value |
+---------------------------------------------------+-------+
| performance_schema_events_statements_history_size | 10 |
+---------------------------------------------------+-------+
1 row in set (0.00 sec)
mysql> show global variables like 'performance_schema_events_statements_history_long_size';
+--------------------------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------------------------+-------+
| performance_schema_events_statements_history_long_size | 10000 |
+--------------------------------------------------------+-------+
1 row in set (0.00 sec)
例:event_statements_*のデータ
SQL_TEXT: Default(performance_schema_max_sql_text_length )で1024byteに設定されていますが、実行されたSQLをもう少し全体的に確認したい場合は、以下の値を変更する事で確認する事が可能です。値を減らすとメモリー使用量は減少しますが、末尾のみが異なる場合は、より多くのステートメントを区別出来なくなり、 値を大きくするとメモリー使用量が増加しますが、長いステートメントを区別する事が可能です。
mysql> show global variables like 'performance_schema_max_sql_text_length';
+----------------------------------------+-------+
| Variable_name | Value |
+----------------------------------------+-------+
| performance_schema_max_sql_text_length | 1024 |
+----------------------------------------+-------+
1 row in set (0.01 sec)
その他:Digest値をベースにサマリを格納している、events_statements_summary_by_digestに関しては「events_statements_summary_by_digestテーブルのパラメータ」こちらの記事が参考になるかと思います。また。少し古いですが、「MySQL Performance Schema Statement Digests」も参考になります。
mysql> show variables like 'max_digest_length';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| max_digest_length | 1024 |
+-------------------+-------+
1 row in set (0.01 sec)
mysql> show variables like 'performance_schema_max_digest_length';
+--------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------+-------+
| performance_schema_max_digest_length | 1024 |
+--------------------------------------+-------+
1 row in set (0.00 sec)
参考:27.10 パフォーマンススキーマのステートメントダイジェストとサンプリング
mysql> SET @stmt = 'SELECT * FROM mytable WHERE cola = 10 AND colb = 20';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT STATEMENT_DIGEST(@stmt);
+------------------------------------------------------------------+
| STATEMENT_DIGEST(@stmt) |
+------------------------------------------------------------------+
| 3bb95eeade896657c4526e74ff2a2862039d0a0fe8a9e7155b5fe492cbd78387 |
+------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT STATEMENT_DIGEST_TEXT(@stmt);
+---------------------------------------------------------+
| STATEMENT_DIGEST_TEXT(@stmt) |
+---------------------------------------------------------+
| SELECT * FROM `mytable` WHERE `cola` = ? AND `colb` = ? |
+---------------------------------------------------------+
1 row in set (0.00 sec)
mysql>
メモリー:Performance_Schemaにおけるメモリー利用量の確認
mysql> pager grep performance_schema.memory
PAGER set to 'grep performance_schema.memory'
mysql> SHOW ENGINE PERFORMANCE_SCHEMA STATUS;select sleep(30); SHOW ENGINE PERFORMANCE_SCHEMA STATUS;
| performance_schema | performance_schema.memory | 231066760 |
248 rows in set (0.01 sec)
1 row in set (30.00 sec)
| performance_schema | performance_schema.memory | 231066760 |
248 rows in set (0.00 sec)
mysql> nopager
PAGER set to stdout
mysql>
PROCESSLISTとの紐付: SHOW PROCESSLISTのID, THEAD_ID, STATEMENT_IDの紐付け
mysql> select * from performance_schema.events_statements_history limit 1\G
*************************** 1. row ***************************
THREAD_ID: 359
EVENT_ID: 84
END_EVENT_ID: 84
EVENT_NAME: statement/sql/select
SOURCE: init_net_server_extension.cc:95
TIMER_START: 56368659182900000
TIMER_END: 56368659426700000
TIMER_WAIT: 243800000
LOCK_TIME: 0
SQL_TEXT: select mysql.slave_relay_log_info
DIGEST: b12a5ae9794c9916a91d125eb5cff183b3985623e16553ecf3ccb8ee0b3f3228
DIGEST_TEXT: SELECT `mysql` . `slave_relay_log_info`
CURRENT_SCHEMA: POC
OBJECT_TYPE: NULL
OBJECT_SCHEMA: NULL
OBJECT_NAME: NULL
OBJECT_INSTANCE_BEGIN: NULL
MYSQL_ERRNO: 1109
RETURNED_SQLSTATE: 42S02
MESSAGE_TEXT: Unknown table 'mysql' in field list
ERRORS: 1
WARNINGS: 0
ROWS_AFFECTED: 0
ROWS_SENT: 0
ROWS_EXAMINED: 0
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
STATEMENT_ID: 1515
CPU_TIME: 0
MAX_CONTROLLED_MEMORY: 1067088
MAX_TOTAL_MEMORY: 1633935
EXECUTION_ENGINE: PRIMARY
1 row in set (0.00 sec)
mysql> show processlist;
+----+-----------------+------------------+------+---------+-------+------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-----------------+------------------+------+---------+-------+------------------------+------------------+
| 7 | event_scheduler | localhost | NULL | Daemon | 67177 | Waiting on empty queue | NULL |
| 26 | root | 172.18.0.1:51586 | POC | Sleep | 8618 | | NULL |
| 35 | root | 172.18.0.1:51622 | POC | Query | 0 | init | show processlist |
+----+-----------------+------------------+------+---------+-------+------------------------+------------------+
3 rows in set (0.00 sec)
mysql> SELECT sys.ps_thread_id(26);
+----------------------+
| sys.ps_thread_id(26) |
+----------------------+
| 359 |
+----------------------+
1 row in set (0.00 sec)
mysql> select * from performance_schema.threads where processlist_id = 26\G
*************************** 1. row ***************************
THREAD_ID: 359
NAME: thread/sql/one_connection
TYPE: FOREGROUND
PROCESSLIST_ID: 26
PROCESSLIST_USER: root
PROCESSLIST_HOST: 172.18.0.1
PROCESSLIST_DB: POC
PROCESSLIST_COMMAND: Sleep
PROCESSLIST_TIME: 8788
PROCESSLIST_STATE: NULL
PROCESSLIST_INFO: NULL
PARENT_THREAD_ID: NULL
ROLE: NULL
INSTRUMENTED: YES
HISTORY: YES
CONNECTION_TYPE: SSL/TLS
THREAD_OS_ID: 395
RESOURCE_GROUP: USR_default
EXECUTION_ENGINE: PRIMARY
CONTROLLED_MEMORY: 1048608
MAX_CONTROLLED_MEMORY: 1662512
TOTAL_MEMORY: 1625391
MAX_TOTAL_MEMORY: 2003298
1 row in set (0.00 sec)
4年前なので情報は古いですが、過去にSYS Schemaの概要をまとめた資料があるので参考迄に。