DBAtlas · データベース運用アトラス

最もコストの高いクエリを特定する (performance_schema digest)

MySQLパフォーマンス

コマンド

SELECT SCHEMA_NAME AS db,
       LEFT(DIGEST_TEXT, 80) AS query,
       COUNT_STAR AS calls,
       ROUND(SUM_TIMER_WAIT / 1e12, 2) AS total_sec,
       ROUND(AVG_TIMER_WAIT / 1e9, 2) AS avg_ms,
       ROUND(QUANTILE_95 / 1e9, 2) AS p95_ms,
       ROUND(100 * SUM_TIMER_WAIT / SUM(SUM_TIMER_WAIT) OVER (), 1) AS pct_total,
       ROUND(SUM_ROWS_EXAMINED / NULLIF(COUNT_STAR, 0)) AS rows_exam_per_call,
       ROUND(SUM_ROWS_SENT / NULLIF(COUNT_STAR, 0)) AS rows_sent_per_call,
       SUM_NO_INDEX_USED AS no_index,
       SUM_CREATED_TMP_DISK_TABLES AS tmp_disk,
       LAST_SEEN
FROM performance_schema.events_statements_summary_by_digest
WHERE SCHEMA_NAME IS NOT NULL
ORDER BY SUM_TIMER_WAIT DESC
LIMIT 20;

-- Server-wide top wait events
SELECT events, total, total_latency, avg_latency FROM sys.waits_global_by_latency LIMIT 10;

概要

正規化されたクエリを合計時間で順位付けし、実行回数、平均および p95 レイテンシ、全体に占める割合、1 回あたりの examined / sent 行数、インデックスを使わない実行、ディスクに書き出された一時テーブルを表示する。2 番目のクエリは、時間がどの待機 (IO、ロック、redo) に費やされているかを示す。

使用する場面

CPU / IO 負荷が上昇したとき、またはユーザーから「データベースが遅い」と報告されたときに最初に確認する。slow log が無効でも機能する。

注意

値は最後の再起動または TRUNCATE TABLE performance_schema.events_statements_summary_by_digest 以降の累積値。現在のアクティビティを見るには 2 つのスナップショットを取得して差分を取る。テーブルは performance_schema_digests_size 行が上限で、満杯になると新しいクエリは DIGEST が NULL の 1 行に集約される。DIGEST_TEXT は performance_schema_max_digest_length (1024) バイトで切り詰められる。時間の単位はピコ秒。rows_exam_per_call / rows_sent_per_call の比率が高いことは、インデックス不足の最も明確な兆候である。

DBAtlas で開く →

関連項目