DataBase / MySQL / レポート取得ガイド
Performance Schema による取得とセクション定義
MySQL 組み込みの低レベル計装フレームワーク Performance Schema を使って、 Oracle AWR 相当の待機イベント・SQL 統計・I/O・メモリ・ロック・ラッチ情報を取得する方法と、 主要テーブルの各列のセクション定義を解説します。
1. Performance Schema の有効化確認
MySQL 8.0 ではデフォルトで有効です。以下で確認・有効化できます。
-- Performance Schema が有効か確認
SHOW VARIABLES LIKE 'performance_schema';
-- Value = ON であれば有効
-- 計装(instrument)の有効化状況確認
SELECT NAME, ENABLED, TIMED
FROM performance_schema.setup_instruments
WHERE NAME LIKE 'wait/%'
AND ENABLED = 'NO'
LIMIT 20;
-- 計装を一括有効化(通常は不要)
UPDATE performance_schema.setup_instruments
SET ENABLED = 'YES', TIMED = 'YES'
WHERE NAME LIKE 'wait/%';
UPDATE performance_schema.setup_consumers
SET ENABLED = 'YES'
WHERE NAME LIKE '%events_waits%'
OR NAME LIKE '%statements%'
OR NAME LIKE '%stages%';
⚠️ 永続的な有効化は my.cnf で設定
UPDATE setup_instruments による変更は再起動で元に戻ります。
永続化するには my.cnf の [mysqld] セクションに
performance_schema=ON を追記し、
performance-schema-instrument='wait/%=ON' などを設定してください。
2. 待機イベント統計(AWR: Top 5 Timed Events 相当)
セクション定義: events_waits_summary_global_by_event_name
-- 合計待機時間の多い上位20イベント
SELECT
EVENT_NAME,
COUNT_STAR AS count_total,
SUM_TIMER_WAIT / 1e12 AS wait_sec_total,
AVG_TIMER_WAIT / 1e9 AS avg_wait_ms,
MAX_TIMER_WAIT / 1e9 AS max_wait_ms
FROM performance_schema.events_waits_summary_global_by_event_name
WHERE COUNT_STAR > 0
ORDER BY SUM_TIMER_WAIT DESC
LIMIT 20;
| 列名 | 説明 | Oracle AWR 対応 |
|---|---|---|
| EVENT_NAME | 待機イベント名。wait/io/file/sql/FRM のような階層構造を持つ。 |
Wait Event Name |
| COUNT_STAR | イベントの発生回数(タイマー有効・無効どちらも含む)。 | Waits |
| SUM_TIMER_WAIT | 合計待機時間(ピコ秒単位)。1e12 で除算すると秒に変換できる。 | Total Wait Time (s) |
| MIN_TIMER_WAIT | 最小待機時間(ピコ秒)。 | Min Wait |
| AVG_TIMER_WAIT | 平均待機時間(ピコ秒)。1e9 で除算するとミリ秒に変換できる。 | Avg Wait (ms) |
| MAX_TIMER_WAIT | 最大待機時間(ピコ秒)。スパイク検出に有用。 | Max Wait |
💡 待機イベントのクラス分類
待機イベント名は
待機イベント名は
wait/io/(I/O待機)、wait/lock/(ロック待機)、
wait/synch/mutex/(ミューテックス=ラッチ相当)などに分類されます。
Oracle AWR の "Wait Class" に対応する概念です。
イベントクラス別集計
-- 待機クラス(カテゴリ)別集計
SELECT
SUBSTRING_INDEX(EVENT_NAME, '/', 3) AS wait_class,
SUM(COUNT_STAR) AS total_count,
SUM(SUM_TIMER_WAIT) / 1e12 AS total_wait_sec
FROM performance_schema.events_waits_summary_global_by_event_name
WHERE COUNT_STAR > 0
GROUP BY wait_class
ORDER BY total_wait_sec DESC;
3. SQL 統計(AWR: SQL Statistics 相当)
セクション定義: events_statements_summary_by_digest
-- 合計実行時間の多い SQL 上位20
SELECT
SCHEMA_NAME,
DIGEST_TEXT,
COUNT_STAR AS exec_count,
SUM_TIMER_WAIT / 1e12 AS total_exec_sec,
AVG_TIMER_WAIT / 1e9 AS avg_exec_ms,
MAX_TIMER_WAIT / 1e9 AS max_exec_ms,
SUM_ROWS_EXAMINED AS rows_examined_total,
SUM_ROWS_SENT AS rows_sent_total,
SUM_CREATED_TMP_TABLES AS tmp_tables_total,
SUM_NO_INDEX_USED AS no_index_total,
FIRST_SEEN,
LAST_SEEN
FROM performance_schema.events_statements_summary_by_digest
ORDER BY SUM_TIMER_WAIT DESC
LIMIT 20;
| 列名 | 説明 | Oracle AWR 対応 |
|---|---|---|
| DIGEST | SQL 正規化ハッシュ値。同一パターンの SQL を同一 DIGEST にまとめる。 | SQL Id |
| DIGEST_TEXT | 正規化された SQL テキスト(リテラルが ? に置換された形)。 |
SQL Text |
| COUNT_STAR | 実行回数の合計。 | Executions |
| SUM_TIMER_WAIT | 合計実行時間(ピコ秒)。最重要指標。 | Elapsed Time (s) |
| AVG_TIMER_WAIT | 平均実行時間(ピコ秒)。単発クエリの重さを示す。 | Elapsed Time per Exec |
| SUM_LOCK_TIME | 合計ロック待機時間(ピコ秒)。テーブルロック待ちを示す。 | —(Lock Wait 相当) |
| SUM_ROWS_EXAMINED | 合計スキャン行数。値が大きいほどフルスキャンの可能性がある。 | Rows Processed / Buffer Gets 相当 |
| SUM_ROWS_SENT | 合計返却行数。 | Rows Processed |
| SUM_CREATED_TMP_DISK_TABLES | ディスク上に作成された一時テーブルの総数。メモリ不足のサイン。 | —(Temp Space 使用 相当) |
| SUM_NO_INDEX_USED | インデックスを使用しなかった実行回数。フルスキャン発生の指標。 | —(Full Table Scan 相当) |
| SUM_SORT_ROWS | ソート処理の合計行数。 | — |
| FIRST_SEEN / LAST_SEEN | その Digest が最初・最後に実行された日時。 | — |
✅ CPU 使用量の多い SQL を抽出
-- CPU時間 = 実行時間 - ロック待ち時間 で近似
SELECT
DIGEST_TEXT,
COUNT_STAR,
(SUM_TIMER_WAIT - SUM_LOCK_TIME) / 1e12 AS cpu_sec_approx,
SUM_TIMER_WAIT / 1e12 AS total_sec,
SUM_ROWS_EXAMINED
FROM performance_schema.events_statements_summary_by_digest
ORDER BY cpu_sec_approx DESC
LIMIT 20;
4. I/O 統計(AWR: File I/O 相当)
セクション定義: file_summary_by_instance
-- ファイル別 I/O 統計
SELECT
FILE_NAME,
COUNT_READ,
SUM_NUMBER_OF_BYTES_READ / 1024 / 1024 AS read_mb,
SUM_TIMER_READ / 1e12 AS read_sec,
COUNT_WRITE,
SUM_NUMBER_OF_BYTES_WRITE / 1024 / 1024 AS write_mb,
SUM_TIMER_WRITE / 1e12 AS write_sec
FROM performance_schema.file_summary_by_instance
ORDER BY (SUM_TIMER_READ + SUM_TIMER_WRITE) DESC
LIMIT 20;
| 列名 | 説明 | Oracle AWR 対応 |
|---|---|---|
| FILE_NAME | ファイルの絶対パス(データファイル・redo ログ・temp ファイルなど)。 | Tablespace / Filename |
| COUNT_READ | 物理読み取り回数。 | Reads |
| SUM_NUMBER_OF_BYTES_READ | 合計読み取りバイト数。 | Read Bytes |
| SUM_TIMER_READ | 合計読み取り待ち時間(ピコ秒)。 | Read Time (s) |
| COUNT_WRITE | 物理書き込み回数。 | Writes |
| SUM_NUMBER_OF_BYTES_WRITE | 合計書き込みバイト数。 | Write Bytes |
| SUM_TIMER_WRITE | 合計書き込み待ち時間(ピコ秒)。 | Write Time (s) |
| COUNT_MISC | その他 I/O 操作(open/close/rename など)の回数。 | — |
5. メモリ統計(AWR: Memory 相当)
セクション定義: memory_summary_global_by_event_name
-- メモリ使用量の多いコンポーネント上位20
SELECT
EVENT_NAME,
CURRENT_COUNT_USED,
CURRENT_NUMBER_OF_BYTES_USED / 1024 / 1024 AS current_mb,
HIGH_NUMBER_OF_BYTES_USED / 1024 / 1024 AS peak_mb,
SUM_NUMBER_OF_BYTES_ALLOC / 1024 / 1024 AS total_alloc_mb
FROM performance_schema.memory_summary_global_by_event_name
WHERE CURRENT_NUMBER_OF_BYTES_USED > 0
ORDER BY CURRENT_NUMBER_OF_BYTES_USED DESC
LIMIT 20;
| 列名 | 説明 | Oracle AWR 対応 |
|---|---|---|
| EVENT_NAME | メモリイベント名。memory/innodb/・memory/sql/ などで分類される。 |
Component Name |
| CURRENT_COUNT_USED | 現在使用中のメモリブロック数。 | — |
| CURRENT_NUMBER_OF_BYTES_USED | 現在使用中のバイト数。最重要指標。 | Current Memory (bytes) |
| HIGH_NUMBER_OF_BYTES_USED | 起動後のピーク時使用バイト数。 | Max Memory |
| SUM_NUMBER_OF_BYTES_ALLOC | 累計割り当てバイト数。 | Total Allocated |
6. ロック・ラッチ統計(AWR: Latch / Lock 相当)
セクション定義: events_waits_summary(mutex / rwlock)
-- ミューテックス待機上位(AWR Latch Activity 相当)
SELECT
EVENT_NAME,
COUNT_STAR AS wait_count,
SUM_TIMER_WAIT / 1e12 AS total_wait_sec,
AVG_TIMER_WAIT / 1e9 AS avg_wait_ms
FROM performance_schema.events_waits_summary_global_by_event_name
WHERE EVENT_NAME LIKE 'wait/synch/mutex/%'
AND COUNT_STAR > 0
ORDER BY SUM_TIMER_WAIT DESC
LIMIT 20;
-- 現在発生中のロック待機(MySQL 8.0+)
SELECT
r.trx_id AS waiting_trx_id,
r.trx_mysql_thread_id AS waiting_thread,
r.trx_query AS waiting_query,
b.trx_id AS blocking_trx_id,
b.trx_mysql_thread_id AS blocking_thread,
b.trx_query AS blocking_query
FROM information_schema.innodb_lock_waits w
JOIN information_schema.innodb_trx r ON r.trx_id = w.requesting_trx_id
JOIN information_schema.innodb_trx b ON b.trx_id = w.blocking_trx_id;
-- Performance Schema でのロック待機履歴
SELECT
EVENT_NAME,
COUNT_STAR,
SUM_TIMER_WAIT / 1e12 AS total_wait_sec
FROM performance_schema.events_waits_summary_global_by_event_name
WHERE EVENT_NAME LIKE 'wait/lock/%'
AND COUNT_STAR > 0
ORDER BY SUM_TIMER_WAIT DESC;
7. トランザクション統計
セクション定義: events_transactions_summary_global_by_event_name
-- コミット・ロールバック統計
SELECT
EVENT_NAME,
COUNT_STAR AS total_trx,
SUM_TIMER_WAIT / 1e12 AS total_sec,
AVG_TIMER_WAIT / 1e9 AS avg_ms
FROM performance_schema.events_transactions_summary_global_by_event_name
WHERE COUNT_STAR > 0;
8. 統計のリセットと差分取得
Performance Schema の統計は MySQL 起動後からの累積値です。 特定期間の差分を取得するには、計測開始時点でリセットするか、 各値を2時点で取得して差分を計算します。
-- 特定テーブルの統計をリセット
TRUNCATE TABLE performance_schema.events_statements_summary_by_digest;
TRUNCATE TABLE performance_schema.events_waits_summary_global_by_event_name;
TRUNCATE TABLE performance_schema.file_summary_by_instance;
-- 全統計を一括リセット(本番環境では注意)
CALL sys.ps_truncate_all_tables(FALSE);
⚠️ 本番環境でのリセットは慎重に
TRUNCATE は不可逆操作です。監視ツールや監査目的で統計を参照している場合、 リセット前にデータを別テーブルへ保存するか、2時点の差分取得方式を使用してください。
TRUNCATE は不可逆操作です。監視ツールや監査目的で統計を参照している場合、 リセット前にデータを別テーブルへ保存するか、2時点の差分取得方式を使用してください。