SQL EXPLAIN 실행계획 완벽 가이드
SQL 쿼리가 느릴 때 가장 먼저 확인해야 하는 것이 바로 실행계획(Execution Plan)입니다. EXPLAIN은 데이터베이스 옵티마이저가 쿼리를 어떤 방식으로 처리할지 결정한 결과를 사람이 읽을 수 있는 형태로 출력해 줍니다. 본 분석기는 MySQL/MariaDB의 표 형식 EXPLAIN과 PostgreSQL의 트리 텍스트 형식을 자동 파싱하여 각 노드(또는 행)의 위험도를 색상으로 표시하고 구체적인 튜닝 방향을 제안합니다.
MySQL EXPLAIN 핵심 컬럼
- type: 접근 방식 — system > const > eq_ref > ref > range > index > ALL 순서. ALL은 풀 테이블 스캔으로 가장 위험합니다.
- key: 실제로 선택된 인덱스. NULL이면 인덱스 미사용입니다.
- rows: 옵티마이저가 추정한 검사 행 수. 수천만 이상이면 점검 필요.
- Extra: Using filesort, Using temporary 등은 메모리/디스크 정렬·임시테이블 발생 신호.
PostgreSQL EXPLAIN 트리 해석
- Seq Scan: 순차 스캔. 작은 테이블에서는 정상이지만 대용량이면 인덱스 추가 검토.
- Index Scan / Index Only Scan: 인덱스 사용 — 일반적으로 양호.
- Nested Loop / Hash Join / Merge Join: 조인 알고리즘. 행 추정과 실제 차이가 크면 통계 갱신(ANALYZE) 필요.
- cost=A..B rows=N: 시작 비용..총 비용과 추정 행. 큰 값에 주목.
일반적인 튜닝 액션
- WHERE/JOIN/ORDER BY 컬럼에 복합 인덱스 추가
- SELECT *를 필요한 컬럼만으로 축소(인덱스 커버링)
- OR을 UNION ALL로 분해, IN 서브쿼리는 JOIN으로 재작성
- 대용량 LIKE '%xxx'는 풀텍스트 인덱스 또는 트라이그램으로 대체
- 옵티마이저 통계 최신화: ANALYZE TABLE, VACUUM ANALYZE
자주 묻는 질문 (FAQ)
Q. EXPLAIN과 EXPLAIN ANALYZE의 차이는?
A. EXPLAIN은 추정만, ANALYZE는 실제 실행해 시간과 실제 행 수를 함께 출력합니다. 운영 DB에서는 트랜잭션을 감안하세요.
Q. 본 도구는 실제 쿼리를 실행하나요?
A. 아닙니다. 입력한 텍스트만 정적 분석하므로 데이터가 외부로 전송되지 않습니다. 모든 처리는 브라우저에서 끝납니다.
Q. Oracle/SQL Server EXPLAIN도 지원하나요?
A. 현재는 MySQL·PostgreSQL 형식 위주이며, 다른 DB는 위험 키워드(Full Scan, Sort 등) 기반 휴리스틱으로 부분 분석 가능합니다.