MySQL Slow Query Reading

이 조회는 “어떤 SQL 패턴이 얼마나 느리고 왜 느린지”를 한 행씩 보여줍니다

핵심은 개별 실행 한 건을 보는 것이 아니라, 같은 형태의 SQL을 묶은 DIGEST를 기준으로 총 비용, 호출 패턴, 읽고 버린 양을 함께 읽는 것입니다.

집계 대상
performance_schema.events_statements_summary_by_digest
DIGEST_TEXT = 같은 SQL 형태를 하나로 묶은 요약 행
STEP 1
어떤 SQL 패턴을 먼저 볼까?
상위 10개를 뽑아 튜닝 우선순위를 정합니다.
ORDER BY SUM_TIMER_WAIT DESC LIMIT 10

가장 오래 기다리게 만든 SQL 패턴부터 확인합니다. 전체 서비스 시간을 가장 많이 잡아먹는 쿼리를 먼저 보는 기준입니다.

STEP 2
느린 이유를 두 갈래로 분해
많이 호출돼서 느린지, 한 번 자체가 느린지 구분합니다.
COUNT_STAR
자주 호출된 쿼리 호출 수가 크면 짧은 쿼리도 누적 비용이 커질 수 있습니다.
AVG_TIMER_WAIT
한 번이 느린 쿼리 호출 수가 적어도 1회 실행 시간이 길면 즉시 체감됩니다.
총 대기시간은 보통 COUNT_STAR × AVG_TIMER_WAIT 관점으로 읽으면 원인이 더 빨리 보입니다.
STEP 3
읽고 버린 양 확인
스캔 낭비가 큰지 rows 비율로 봅니다.
SUM_ROWS_EXAMINED
얼마나 많이 읽었나 엔진이 조건을 판단하려고 실제로 훑은 행 수입니다.
SUM_ROWS_SENT
얼마나 돌려줬나 사용자에게 실제 결과로 전달된 행 수입니다.
rows_ratio = SUM_ROWS_EXAMINED / SUM_ROWS_SENT
예: 50,000 / 10 = 5,000 이면 결과 1행을 보내기 위해 너무 많은 행을 읽고 버린 것입니다.
읽는 순서: 먼저 SUM_TIMER_WAIT로 우선순위를 잡고, 다음에 COUNT_STARAVG_TIMER_WAIT로 원인을 나눈 뒤, rows_ratio가 크면 인덱스, 조건 선택도, 불필요한 스캔을 의심합니다.