SQL: EXPLAIN

김기현·2025년 6월 16일

Database

목록 보기
17/24

EXPLAINSQL 쿼리의 실행 계획을 분석할 수 있게 해주는 명령어이다. 주로 SELECT, DELETE, UPDATE, INSERT, REPLACE 문 앞에 붙여 사용하며, 쿼리가
어떻게 실행될지, 어떤 인덱스를 사용할지, 어떤 순서로 테이블이 접근될지 등을 확인할 수 있다.
이를 통해 성능 병목을 파악하고 인덱스 최적화나 쿼리 구조 개션을 할 수 있다.

사용법

EXPLAIN
SELECT *
FROM users
WHERE age > 30;

EXPLAIN FORMAT = JSON
SELECT *
FROM users
WHERE age > 30;

주요 컬럼 설명

EXPLAIN의 결과로 여러 개의 컬럼을 반하며 주요 컬럼은 다음과 같다.

컬럼 이름설명
id쿼리의 순서 또는 중첩된 쿼리의 단계 표시. 숫자가 클수록 먼저 실행됨.
select_type쿼리의 유형 (예: SIMPLE, PRIMARY, SUBQUERY, DERIVED 등)
table접근하는 테이블 이름
type조인의 유형 또는 액세스 방식 (이 값이 중요!)
possible_keys사용할 수 있는 인덱스 목록
key실제 사용된 인덱스
key_len사용된 인덱스의 길이
ref어떤 컬럼이나 상수가 인덱스를 통해 참조되는지
rowsMySQL이 검사할 것으로 예상하는 행의 수
Extra추가적인 정보 (Using index, Using where, Using temporary 등)

type 컬럼

이 컬럼은 조인의 효율성을 나타낸다. 아래로 갈수록 성능이 떨어진다.

  1. system: 테이블에 1개의 row만 있음.
  2. const: 상수처럼 취급되는 row.
  3. eq_ref: 인덱스를 통해 정확히 하나의 row를 찾았다.
  4. ref: 인덱스를 통해 여러 row를 찾았다.
  5. range: 범위 검색(BETWEEN, >, <).
  6. index: 테이블 전체를 인덱스로 스캔.
  7. ALL: 테이블 전체를 스캔(풀 데이터 스캔, 성능 최악)

ALL이 나올 경우 성능 이슈를 의심해보아야 한다.

활용 팁

  1. 인덱스가 사용되지 않을 때: possible_key는 있는데 keyNULL이면 인덱스를 무시하고 있다는 의미이며 쿼리나 인덱스 개선이 필요하다.
  2. Using temporaryUsing filesort는 성능 이슈를 일으킬 수 있는 신호이다.
  3. EXPLAIN FORMAT=JSON을 사용하면 훨씬 상세한 실행 계획을 볼 수 있다.
  4. row의 수가 너무 적다면 FORCE INDEX (인덱스명)을 사용해서 인덱스 사용을 강제해서 테스트하면 된다.
profile
백엔드 개발자를 목표로 공부하는 대학생

0개의 댓글