MySQL EXPLAIN ANALYZE로 실제 실행 확인하기
조회 1 · 댓글 0
느린 쿼리를 EXPLAIN으로 봐도 예상 rows와 cost뿐이라 실제로 어디서 시간을 잡아먹는지는 안 보입니다. MySQL 8.0.18부터 나온 EXPLAIN ANALYZE는 쿼리를 실제로 실행한 뒤 각 단계(iterator)의 실측 시간과 처리 행수를 TREE 형식으로 보여줍니다.
EXPLAIN ANALYZE SELECT * FROM t3 WHERE pk > 17\G
-> Filter: (t3.pk > 17) (cost=0.91 rows=2)
(actual time=0.0334..0.042 rows=2 loops=1)
-> Index range scan on t3 using PRIMARY over (17 < pk)
(cost=0.91 rows=2) (actual time=0.0306..0.0384 rows=2 loops=1)읽는 법은 각 노드의 actual time=A..B rows=N loops=M 부분입니다. A는 첫 행을 꺼내는 데 걸린 평균 시간(ms), B는 모든 행을 꺼내는 데 걸린 평균 시간(ms)이고 loops는 그 노드가 반복 실행된 횟수입니다. 옵티마이저의 예상 rows와 actual rows 차이가 수십 배 이상 벌어지는 노드가 있으면 통계나 인덱스가 부실하다는 신호이니 그 지점부터 파고들면 됩니다.
주의할 점은 EXPLAIN ANALYZE가 쿼리를 실제로 돌린다는 것입니다. SELECT는 상관없지만 다중 테이블 UPDATE나 DELETE에 쓰면 데이터가 실제로 바뀝니다. 운영 데이터에서 테스트하려면 트랜잭션으로 감싸고 롤백하거나 복제본에서 확인하세요. 출력은 TREE 전용이라 FORMAT=JSON이나 FORMAT=TRADITIONAL을 붙이면 오류가 납니다.
로그인 후 답글을 남길 수 있습니다.