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

mysqldumpslow / pt-query-digest による取得とセクション定義

Slow Query Log を集計・解析するツールとして、MySQL 付属の mysqldumpslow と Percona Toolkit の pt-query-digest を解説します。 両ツールとも Oracle AWR の SQL Statistics セクションに相当する クエリ別の集計レポートを生成でき、チューニング対象の SQL 特定に役立ちます。

1. 2ツールの比較

観点mysqldumpslowpt-query-digest
配布元 MySQL 本体に付属 Percona Toolkit(別途インストール)
出力の詳細度 シンプル(件数・実行時間・行数の集計) 詳細(パーセンタイル・標準偏差・ヒストグラム含む)
入力ソース Slow Query Log ファイルのみ Slow Log・General Log・Binary Log・tcpdump など
フィルタリング 基本的なオプションのみ 豊富なフィルタ・ホスト別・ユーザー別・時間帯別など
AWR との対応 SQL Statistics の簡易版 SQL Statistics にほぼ完全対応
推奨場面 簡易確認・追加インストール不要の環境 本格的なチューニング・定期レポート生成

2. mysqldumpslow — 使い方とセクション定義

bash — 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

出力例と各フィールドの定義

出力例 — mysqldumpslow
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 — インストール

bash — インストール方法
# 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 — 基本的な使い方

bash — 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 対応
RankResponse time でソートされた順位。1位が最もチューニング効果が大きい。Rank(SQL ordered by ...)
Query IDクエリパターンのハッシュ ID。同一パターンを一意に識別する。SQL Id
Response time合計応答時間と全体に占める割合(%)。Total Elapsed Time / %
Calls実行回数。Executions
R/Call1回あたりの平均応答時間(秒)。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 — 高度なオプション

bash — 高度なオプション例
# 結果を 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 で毎日実行し、前日との差分を確認するのが実用的な運用パターンです。