DataBase / MySQL / レポート取得ガイド
mysqldumpslow / pt-query-digest による取得とセクション定義
Slow Query Log を集計・解析するツールとして、MySQL 付属の mysqldumpslow と Percona Toolkit の pt-query-digest を解説します。 両ツールとも Oracle AWR の SQL Statistics セクションに相当する クエリ別の集計レポートを生成でき、チューニング対象の SQL 特定に役立ちます。
1. 2ツールの比較
| 観点 | mysqldumpslow | pt-query-digest |
|---|---|---|
| 配布元 | MySQL 本体に付属 | Percona Toolkit(別途インストール) |
| 出力の詳細度 | シンプル(件数・実行時間・行数の集計) | 詳細(パーセンタイル・標準偏差・ヒストグラム含む) |
| 入力ソース | Slow Query Log ファイルのみ | Slow Log・General Log・Binary Log・tcpdump など |
| フィルタリング | 基本的なオプションのみ | 豊富なフィルタ・ホスト別・ユーザー別・時間帯別など |
| AWR との対応 | SQL Statistics の簡易版 | SQL Statistics にほぼ完全対応 |
| 推奨場面 | 簡易確認・追加インストール不要の環境 | 本格的なチューニング・定期レポート生成 |
2. mysqldumpslow — 使い方とセクション定義
セクション定義: mysqldumpslow 出力
# 実行時間の合計が多い順で上位20件を表示(最も基本的な使い方)
mysqldumpslow -s t -t 20 /var/log/mysql/mysql-slow.log
# オプション説明
# -s t : 合計実行時間(sum of query time)でソート
# -s at : 平均実行時間(average query time)でソート
# -s c : 実行回数(count)でソート
# -s r : スキャン行数の合計(sum of rows examined)でソート
# -t N : 上位 N 件を表示
# -g : 正規表現でフィルタ(grep 的な絞り込み)
# -a : 数値・文字列をN/?に抽象化しない(デフォルトは抽象化)
# 平均実行時間が長い SELECT のみ上位10件
mysqldumpslow -s at -t 10 -g "SELECT" /var/log/mysql/mysql-slow.log
出力例と各フィールドの定義
Reading mysql slow query log from /var/log/mysql/mysql-slow.log
Count: 42 Time=3.46s (145s) Lock=0.00s (0s) Rows=1.0 (42), appuser[appuser]@web01
SELECT u.user_id, u.name, COUNT(o.order_id) AS order_count
FROM users u LEFT JOIN orders o ON u.user_id = o.user_id
WHERE u.created_at >= 'S'
GROUP BY u.user_id ORDER BY order_count DESC LIMIT N
Count: 156 Time=1.23s (192s) Lock=0.00s (0s) Rows=50.2 (7831), appuser[appuser]@web01
SELECT * FROM products WHERE category_id = N AND status = 'S'
ORDER BY created_at DESC LIMIT N
| フィールド | 説明 | Oracle AWR 対応 |
|---|---|---|
| Count | 同一パターンのクエリが何回実行されたか。 | Executions |
| Time=X.XXs (Ys) | 平均実行時間(X.XXs)と合計実行時間(Ys)。 チューニング優先度は合計時間(Ys)を基準にするとよい。 | Elapsed Time per Exec / Total Elapsed |
| Lock=X.XXs (Ys) | 平均ロック待ち時間と合計ロック待ち時間。 | —(Lock Wait 相当) |
| Rows=X.X (Y) | 平均返却行数と合計返却行数。 | Rows Processed |
| user@host | 実行ユーザーとクライアントホスト。 | Parsing User / Module |
| SQL テキスト | 正規化された SQL テキスト(数値は N、文字列は S に抽象化)。 | SQL Text |
3. pt-query-digest — インストール
# Percona Toolkit を yum/dnf でインストール(RHEL 系)
sudo yum install percona-toolkit
# または
sudo dnf install percona-toolkit
# APT でインストール(Debian/Ubuntu 系)
sudo apt-get install percona-toolkit
# Percona リポジトリから直接インストール
curl -O https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb
sudo dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb
sudo apt-get update && sudo apt-get install percona-toolkit
# バージョン確認
pt-query-digest --version
4. pt-query-digest — 基本的な使い方
# 基本:Slow Query Log を解析してレポート出力
pt-query-digest /var/log/mysql/mysql-slow.log
# 上位20クエリのみ表示
pt-query-digest --limit 20 /var/log/mysql/mysql-slow.log
# 特定時間帯のみ解析(2026-05-29 14:00〜15:00)
pt-query-digest \
--since '2026-05-29 14:00:00' \
--until '2026-05-29 15:00:00' \
/var/log/mysql/mysql-slow.log
# HTML レポートとして出力
pt-query-digest \
--output report \
--report-format query_report \
/var/log/mysql/mysql-slow.log > report.txt
# 特定 DB のクエリのみ
pt-query-digest \
--filter '$event->{db} eq "mydb"' \
/var/log/mysql/mysql-slow.log
# フルスキャンのみ
pt-query-digest \
--filter '$event->{Full_scan} eq "Yes"' \
/var/log/mysql/mysql-slow.log
# MySQL に直接接続してリアルタイム解析(tcpdump)
sudo tcpdump -s 65535 -x -nn -q -tttt -i any -c 1000 port 3306 \
| pt-query-digest --type tcpdump
5. pt-query-digest — 出力セクション定義
pt-query-digest の出力は以下の3つのセクションで構成されます。
セクション 1: ファイル全体サマリー(AWR: DB Time / Report Summary 相当)
# 450ms user time, 20ms system time, 31.59M rss, 277.29M vsz
# Current date: Fri May 29 14:30:00 2026
# Hostname: db-server01
# Files: /var/log/mysql/mysql-slow.log
# Overall: 3.26k total, 127 unique, 10.87 QPS, 7.83x concurrency ___________
# Time range: 2026-05-29 13:55:00 to 2026-05-29 14:00:00
# Attribute total min max avg 95% stddev median
# ============ ======= ======= ======= ======= ======= ======= =======
# Exec time 2345s 1ms 45.2s 718ms 3.12s 2.45s 213ms
# Lock time 1.23s 0 456ms 376us 1.45ms 18ms 109us
# Rows sent 87.1k 0 9.80k 26.70 98.00 228.10 1.00
# Rows examine 3.45G 0 20.48M 1.06M 5.18M 2.34M 82.29k
# Query size 98.40k 40 1.71k 30.91 73.63 42.81 25.52
| フィールド | 説明 | Oracle AWR 対応 |
|---|---|---|
| Overall | 解析対象の総クエリ数・ユニーク数・QPS・並行度。 | Report Summary / DB Time |
| Time range | ログファイルの解析対象期間。 | Begin Snap / End Snap |
| Exec time (total) | 全クエリの合計実行時間。DB Time に相当する最重要指標。 | DB Time |
| Exec time (95%) | 95 パーセンタイル実行時間。外れ値を除いた実質的な最大時間。 | — |
| Rows examine | 全クエリのスキャン行数統計。total が大きいと I/O 負荷が高い。 | Buffer Gets 合計 相当 |
| concurrency | 並行実行クエリ数の推定値(DB Time / 期間)。 | Average Active Sessions |
セクション 2: クエリランキング(AWR: SQL Statistics 相当)
# Profile
# Rank Query ID Response time Calls R/Call V/M Item
# ==== ================== ============== ===== ====== ===== ====
# 1 0xABC123... 712.3456 30.4% 42 16.96 0.72 SELECT users orders
# 2 0xDEF456... 523.1234 22.3% 156 3.35 0.31 SELECT products
# 3 0x789ABC... 298.4567 12.7% 891 0.34 0.08 SELECT sessions
# MISC 0xMISC 842.0000 35.9% 2168 0.39 0.0 <124 ITEMS>
| フィールド | 説明 | Oracle AWR 対応 |
|---|---|---|
| Rank | Response time でソートされた順位。1位が最もチューニング効果が大きい。 | Rank(SQL ordered by ...) |
| Query ID | クエリパターンのハッシュ ID。同一パターンを一意に識別する。 | SQL Id |
| Response time | 合計応答時間と全体に占める割合(%)。 | Total Elapsed Time / % |
| Calls | 実行回数。 | Executions |
| R/Call | 1回あたりの平均応答時間(秒)。 | Elapsed Time per Exec |
| V/M | 変動係数(標準偏差/平均)。1.0 以上は実行時間が不安定なことを示す。 | — |
セクション 3: 個別クエリ詳細(AWR: SQL Detail 相当)
# Query 1: 0.14 QPS, 2.41x concurrency, ID 0xABC123... at byte 1024 ________
# This item is included in the report because it matches --limit.
# Scores: V/M = 0.72
# Time range: 2026-05-29 13:55:12 to 2026-05-29 14:00:00
# Attribute pct total min max avg 95% stddev median
# ============ === ======= ======= ======= ======= ======= ======= =======
# Count 1 42
# Exec time 30 712s 8.23s 45.23s 16.96s 38.12s 12.34s 14.21s
# Lock time 0 1.23ms 12us 456us 29us 89us 78us 18us
# Rows sent 0 42 1 1 1 1 0 1
# Rows examine 62 2.14G 48.91M 52.34M 50.86M 52.00M 1.23M 50.86M
# Query size 0 2.98k 72 72 72 72 0 72
# String:
# Databases mydb
# Hosts web01 (42/100%)
# Users appuser (42/100%)
# Query_time distribution
# 1us
# 10us
# 100us
# 1ms
# 10ms
# 100ms
# 1s ################################################################
# 10s+ ##############
# Tables
# SHOW TABLE STATUS FROM `mydb` LIKE 'users'\G
# SHOW CREATE TABLE `mydb`.`users`\G
# SHOW TABLE STATUS FROM `mydb` LIKE 'orders'\G
# SHOW CREATE TABLE `mydb`.`orders`\G
# EXPLAIN /*!50100 PARTITIONS*/
SELECT u.user_id, u.name, COUNT(o.order_id) AS order_count
FROM users u LEFT JOIN orders o ON u.user_id = o.user_id
WHERE u.created_at >= '2025-01-01'
GROUP BY u.user_id ORDER BY order_count DESC LIMIT 100\G
| フィールド | 説明 | Oracle AWR 対応 |
|---|---|---|
| Exec time (pct) | 全体に占めるこのクエリの実行時間の割合。 | % Total DB Time |
| Exec time (95%) | 95 パーセンタイル実行時間。外れ値を含まない最大時間の目安。 | — |
| Rows examine (avg) | 平均スキャン行数。Rows sent と大きく乖離している場合、インデックスが有効でない。 | Buffer Gets per Exec |
| Query_time distribution | 実行時間のヒストグラム。バイモーダル(ふたこぶ)な場合、キャッシュヒット有無で差がある可能性。 | — |
| EXPLAIN | そのクエリの EXPLAIN 文。実行してアクセスパスを確認できる。 | — |
6. pt-query-digest — 高度なオプション
# 結果を MySQL テーブルに保存(定期レポート用途)
pt-query-digest \
--review h=localhost,D=myreport,t=query_review \
--review-history h=localhost,D=myreport,t=query_review_history \
--no-report \
/var/log/mysql/mysql-slow.log
# ホスト別に集計(分散環境での解析)
pt-query-digest --group-by host /var/log/mysql/mysql-slow.log
# 特定クエリパターンのみ詳細表示
pt-query-digest \
--filter '($event->{fingerprint} =~ m/users/i)' \
/var/log/mysql/mysql-slow.log
# 実行回数が100回以上のクエリのみ
pt-query-digest \
--filter '$event->{count} >= 100' \
/var/log/mysql/mysql-slow.log
# JSON 形式で出力
pt-query-digest \
--output json \
/var/log/mysql/mysql-slow.log > report.json
✅ 定期レポート自動化のすすめ
--review オプションで結果を DB テーブルに蓄積すると、
Oracle AWR のスナップショット比較に近い「期間比較レポート」が実現できます。
cron で毎日実行し、前日との差分を確認するのが実用的な運用パターンです。