DBAtlas · Atlas de operações de banco de dados

Encontrar as consultas mais caras (digest do performance_schema)

MySQLDesempenho

Comando

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;

O que faz

Classifica as consultas normalizadas pelo tempo total, com número de chamadas, latência média e p95, participação no total, linhas examinadas / enviadas por chamada, execuções sem índice e tabelas temporárias gravadas em disco. A segunda consulta mostra em quais esperas (IO, locks, redo) o tempo é gasto.

Quando usar

Primeira parada quando a carga de CPU / IO sobe ou os usuários relatam 'o banco está lento'; funciona mesmo com o slow log desligado.

Atenção

Os valores são cumulativos desde o último restart ou TRUNCATE TABLE performance_schema.events_statements_summary_by_digest; tire dois snapshots e compare-os para ver a atividade atual. A tabela é limitada a performance_schema_digests_size linhas; quando cheia, novas consultas são agregadas em uma única linha com DIGEST NULL. DIGEST_TEXT é cortado em performance_schema_max_digest_length (1024) bytes. Os tempos estão em picossegundos. Uma razão rows_exam_per_call / rows_sent_per_call alta é o sinal mais claro de índice ausente.

Abrir no DBAtlas →

Relacionados