가장 비용이 큰 쿼리 찾기 (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 비율이 높으면 인덱스 누락의 가장 명확한 신호다.