MySQL の sys スキーマで問題クエリを素早く発見する

sys スキーマは MySQL 5.7 で標準搭載された、Performance Schema のデータを人間が読みやすい形式で提供するビューとプロシージャのコレクションです。複雑なクエリを書かなくても、パフォーマンス問題を素早く発見できます。

sys スキーマの確認

MySQL 5.7 以降では、デフォルトでインストールされています。

USE sys;
SHOW TABLES;

約 100 個のビューとプロシージャが用意されています。各ビューには x$ プレフィックス付きの生データ版もあります。

通常のビュー(例: statement_analysis)

人間向けに整形済み(時間を「1.5 h」のように表示)

xstatement_analysis)

生データ(ピコ秒単位)、プログラムで処理しやすい

問題のあるクエリを見つける

最もよく使うビューが statement_analysis です。実行時間が長いクエリを簡単に特定できます。

SELECT * FROM sys.statement_analysis
ORDER BY total_latency DESC
LIMIT 10;
意味
queryクエリのダイジェスト
total_latency合計実行時間
exec_count実行回数
avg_latency平均実行時間
rows_examined_avg平均走査行数
rows_sent_avg平均返却行数

フルスキャンクエリの特定

テーブルフルスキャンを行っているクエリを見つけます。

SELECT * FROM sys.statements_with_full_table_scans
ORDER BY no_index_used_count DESC
LIMIT 10;

このビューに表示されるクエリは、インデックスの追加を検討すべき候補です。

一時テーブルを使うクエリ

ディスク一時テーブルを作成するクエリを特定します。

SELECT * FROM sys.statements_with_temp_tables
ORDER BY disk_tmp_tables DESC
LIMIT 10;

disk_tmp_tables が多いクエリは、クエリの改善か tmp_table_size の調整が必要です。

未使用インデックス

一度も使われていないインデックスを一覧表示します。

SELECT * FROM sys.schema_unused_indexes
WHERE object_schema NOT IN ('mysql', 'sys', 'performance_schema');

このリストに表示されるインデックスは、削除を検討できます。ただし、サーバー起動後からの統計なので、月次バッチなど低頻度のクエリで使われている可能性も考慮してください。

重複インデックス

冗長なインデックスを検出します。

SELECT * FROM sys.schema_redundant_indexes
WHERE table_schema NOT IN ('mysql', 'sys', 'performance_schema');

たとえば (user_id)(user_id, status) の両方があれば、(user_id) は不要と判断されます。

テーブルごとの I/O 統計

どのテーブルへのアクセスが多いか確認できます。

SELECT * FROM sys.schema_table_statistics
WHERE table_schema = 'your_database'
ORDER BY total_latency DESC
LIMIT 10;
rows_fetched

読み取られた行数

rows_inserted / rows_updated / rows_deleted

それぞれの操作で影響を受けた行数

io_read / io_write

ファイル I/O の量

待機イベントの確認

何を待っているかをわかりやすく表示します。

SELECT * FROM sys.wait_classes_global_by_latency
ORDER BY total_latency DESC;

I/O 待ち、ロック待ちなど、ボトルネックの傾向が把握できます。

メモリ使用状況

各コンポーネントのメモリ使用量を確認します。

SELECT * FROM sys.memory_global_total;

SELECT * FROM sys.memory_by_thread_by_current_bytes
ORDER BY current_allocated DESC
LIMIT 10;

スレッドごとのメモリ使用量も確認できるため、メモリリークの調査に役立ちます。

ユーザーごとの統計

ユーザー(接続元)ごとのリソース使用状況を確認します。

SELECT * FROM sys.user_summary;

特定のアプリケーションやユーザーが異常に多くのリソースを消費していないか確認できます。

プロシージャの活用

sys スキーマには便利なプロシージャも含まれています。

-- Performance Schema の全統計をリセット
CALL sys.ps_truncate_all_tables(FALSE);

-- 特定のスレッドのステートメント履歴を表示
CALL sys.ps_thread_stack(12345, FALSE);

実践的なトラブルシューティングフロー

sys スキーマを使った問題調査の流れを示します。

statement_analysis で遅いクエリを特定

statements_with_full_table_scans でインデックス不足を確認

schema_unused_indexes で不要インデックスを確認

wait_classes_global_by_latency でボトルネックを特定

注意点

sys スキーマのビューはリアルタイムではなく、累積統計を表示します。特定の期間を分析したい場合は、CALL sys.ps_truncate_all_tables(FALSE) でリセットしてから計測を始めてください。

また、sys スキーマは Performance Schema に依存しているため、Performance Schema が無効だと使えません。

sys スキーマを使いこなせば、パフォーマンス問題の 8 割は素早く原因を特定できるようになります。まずは statement_analysis から使い始めてみてください。