DataBase  /  MySQL  /  レポート取得ガイド

Performance Schema による取得とセクション定義

MySQL 組み込みの低レベル計装フレームワーク Performance Schema を使って、 Oracle AWR 相当の待機イベント・SQL 統計・I/O・メモリ・ロック・ラッチ情報を取得する方法と、 主要テーブルの各列のセクション定義を解説します。

1. Performance Schema の有効化確認

MySQL 8.0 ではデフォルトで有効です。以下で確認・有効化できます。

SQL — 有効化確認
-- 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 相当)

SQL — 待機イベント上位取得(AWR Top 5 相当)
-- 合計待機時間の多い上位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" に対応する概念です。

イベントクラス別集計

SQL — 待機クラス別集計
-- 待機クラス(カテゴリ)別集計
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 相当)

SQL — 重い SQL 上位取得(AWR SQL Statistics 相当)
-- 合計実行時間の多い 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 を抽出
SQL — CPU 時間順(AWR SQL ordered by CPU Time 相当)
-- 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 相当)

SQL — ファイル別 I/O 統計(AWR File I/O 相当)
-- ファイル別 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 相当)

SQL — メモリ使用量上位(AWR Memory 相当)
-- メモリ使用量の多いコンポーネント上位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 相当)

SQL — ミューテックス待機(AWR Latch 相当)
-- ミューテックス待機上位(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;
SQL — InnoDB ロック待機(AWR Lock 相当)
-- 現在発生中のロック待機(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. トランザクション統計

SQL — トランザクション統計
-- コミット・ロールバック統計
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時点で取得して差分を計算します。

SQL — 統計リセット
-- 特定テーブルの統計をリセット
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時点の差分取得方式を使用してください。