MySQL EXPLAIN 가이드: 실행 계획은 어떻게 읽어야 할까
DB

MySQL EXPLAIN 가이드: 실행 계획은 어떻게 읽어야 할까


MySQL 성능 문제를 볼 때 가장 먼저 익혀야 하는 도구 중 하나가 EXPLAIN입니다. 쿼리 자체만 읽어서는 왜 느린지 잘 안 보여도, 실행 계획을 보면 어떤 방식으로 데이터를 읽고 있는지 힌트를 얻을 수 있습니다.

이 글에서는 아래 내용을 정리합니다.

  • EXPLAIN이 무엇인지
  • 어떤 컬럼부터 봐야 하는지
  • type, key, rows, Extra를 어떻게 읽으면 좋은지
  • 입문자가 어떤 순서로 해석하면 좋은지

핵심은 EXPLAIN은 SQL 문장을 평가하는 도구가 아니라, MySQL이 그 SQL을 어떻게 실행하려는지 보여주는 창이라는 점입니다.

EXPLAIN은 무엇을 보여주나

EXPLAIN은 쿼리를 실제로 어떤 접근 경로로 처리할지 보여줍니다.

즉:

  • 어떤 테이블부터 읽는지
  • 인덱스를 쓰는지
  • 몇 row 정도를 읽을 것으로 보는지
  • 정렬이나 임시 테이블이 필요한지

같은 정보를 얻을 수 있습니다.

초보자는 무엇부터 보면 좋을까

처음에는 아래 네 가지에 집중하는 것이 좋습니다.

  • type
  • key
  • rows
  • Extra

이 네 개만 봐도 꽤 많은 문제를 빨리 감지할 수 있습니다.

type은 왜 중요한가

type은 MySQL이 얼마나 효율적으로 데이터를 읽는지 보여주는 단서입니다.

예를 들어:

  • ALL: 풀스캔 가능성
  • ref, range: 어느 정도 인덱스를 활용
  • const: 매우 제한적인 조회

입문 단계에서는 ALL이 자주 보이면 한 번 더 의심하는 습관이 좋습니다.

key는 무엇을 뜻하나

key는 실제로 사용하려는 인덱스를 보여줍니다.

만약:

  • 기대한 인덱스가 안 잡히거나
  • NULL이 나온다면

인덱스 설계나 쿼리 조건을 다시 볼 필요가 있습니다.

rows는 왜 중요할까

rows는 MySQL이 얼마나 많은 row를 읽을 것으로 예상하는지 보여줍니다.

이 수가 크면:

  • 실제로 읽는 양이 많을 가능성이 높고
  • 성능 병목 가능성도 커집니다

즉, rows는 “이 쿼리가 얼마나 넓게 훑는가”를 빠르게 보는 지표입니다.

Extra에서 자주 보는 신호

입문자가 자주 기억해두면 좋은 것은:

  • Using filesort
  • Using temporary
  • Using where

특히 filesort와 temporary는 정렬이나 임시 작업 비용을 의심하게 해주는 신호입니다.

EXPLAIN을 볼 때 주의할 점

EXPLAIN은 매우 유용하지만, 그것만으로 모든 것을 알 수 있는 것은 아닙니다.

왜냐하면:

  • 실제 데이터 분포와 다를 수 있고
  • 예상 row 수가 부정확할 수 있으며
  • 운영 트래픽 상황은 반영되지 않을 수 있기 때문입니다

즉, EXPLAIN은 출발점이지 전부는 아닙니다.

자주 하는 오해

1. EXPLAIN 결과만 좋으면 성능도 무조건 좋다

실제 데이터 양과 트래픽에 따라 다를 수 있습니다.

2. rows가 작으면 무조건 괜찮다

조인 구조나 정렬 비용이 더 클 수도 있습니다.

3. key가 잡히면 인덱스 문제는 끝이다

잘못된 인덱스를 사용하고 있을 수도 있습니다.

FAQ

Q. EXPLAIN은 언제 보는 것이 좋을까

느린 쿼리, 자주 실행되는 쿼리, 인덱스 추가 전후 비교에 특히 좋습니다.

Q. 가장 먼저 의심할 신호는 무엇인가

입문자라면 type = ALL, key = NULL, rows 과다를 먼저 보는 것이 좋습니다.

Q. EXPLAIN만 익혀도 도움이 되나

매우 도움이 됩니다. MySQL 성능 분석의 기본 감각을 빠르게 익힐 수 있습니다.

먼저 읽어볼 가이드

검색 유입이 많은 핵심 글부터 이어서 보세요.