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-задержка, доля от общего времени, прочитанные / отправленные строки на вызов, выполнения без индекса и временные таблицы, сброшенные на диск. Второй запрос показывает, на какие ожидания (IO, блокировки, redo) уходит время.

Когда использовать

Первый шаг при росте нагрузки на CPU / IO или жалобах пользователей «база тормозит»; работает даже при выключенном slow log.

Внимание

Значения накапливаются с последнего перезапуска или TRUNCATE TABLE performance_schema.events_statements_summary_by_digest; снимите два снимка и сравните их, чтобы увидеть текущую активность. Таблица ограничена performance_schema_digests_size строками; после заполнения новые запросы агрегируются в одну строку с DIGEST = NULL. DIGEST_TEXT обрезается до performance_schema_max_digest_length (1024) байт. Время указано в пикосекундах. Высокое соотношение rows_exam_per_call / rows_sent_per_call — самый явный признак отсутствующего индекса.

Открыть в DBAtlas →

Связанные материалы