Encontrar as consultas mais caras (digest do performance_schema)
MySQLDesempenhoComando
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.
Relacionados
- O que está rodando agora: sessões ativas, latência, locks e transações (sys.session)
- Diagnosticar 'Waiting for table metadata lock' e encontrar o verdadeiro bloqueador
- Analisar deadlocks do InnoDB e registrar todos eles
- Transações de longa duração e history list length (atraso do purge)
- Capturar um slow log completo curto e analisá-lo com pt-query-digest
- Depurar um plano ruim com EXPLAIN ANALYZE e o optimizer trace