DB/Mysql

🔍 MySQL 실행 계획(Execution Plan)

hoonylab 2025. 4. 8. 17:33
728x90
반응형

MySQL에서 쿼리 성능을 분석하고 최적화할 때 반드시 알아야 할 것이 실행 계획(Execution Plan) 입니다.
이 글에서는 실행 계획이 무엇인지, 어떻게 확인하고 해석하는지, 그리고 성능 향상을 위한 팁까지 상세히 설명합니다.


📌 실행 계획이란?

MySQL이 쿼리를 어떻게 실행할지 내부적으로 결정한 전략입니다.
예를 들어 어떤 인덱스를 사용할지, 어떤 테이블부터 읽을지, 조인은 어떤 방식으로 할지 등을 포함합니다.

실행 계획은 옵티마이저(Optimizer)에 의해 자동으로 결정되며, 쿼리를 최대한 빠르게 수행하기 위한 로드맵 역할을 합니다.

SQL Execution Plan Diagram


✅ 실행 계획 확인 방법: EXPLAIN

아래처럼 EXPLAIN 키워드를 붙이면 쿼리의 실행 계획을 확인할 수 있습니다.

EXPLAIN SELECT * FROM employees WHERE dept_no = 'd005';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE employees ref dept_no_idx dept_no_idx 4 const 15 Using where

🧩 주요 컬럼 설명

컬럼명 설명
id 쿼리 실행 순서를 나타냅니다. 숫자가 클수록 나중에 실행됩니다.
select_type 쿼리의 SELECT 유형 (단순 쿼리, 서브쿼리 등)
table 접근하는 테이블 이름
type 조인의 방식 (가장 중요한 성능 지표 중 하나)
possible_keys 사용할 수 있는 인덱스 목록
key 실제로 사용된 인덱스
key_len 사용된 인덱스의 길이 (바이트 단위)
ref 어떤 값과 인덱스를 비교했는지
rows MySQL이 예측한 읽을 행의 수
Extra 추가 정보 (filesort, temporary 등)

⚠️ type 컬럼의 중요도 (좋은 순서대로)

type은 조인의 성능에 가장 큰 영향을 주는 요소입니다.

MySQL Join Types Performance

type 값 설명
system 단 하나의 row만 존재하는 테이블 (가장 빠름)
const 프라이머리 키 등으로 하나의 row만 조회
eq_ref 조인에서 PK나 UNIQUE 인덱스를 사용해 하나의 row를 조회
ref non-unique 인덱스를 사용한 조회
range 인덱스를 범위 조건으로 조회 (BETWEEN, <, > 등)
index 인덱스를 전체 스캔 (테이블은 건드리지 않음)
ALL 테이블 풀스캔 (성능 최악) ❌

ALL이나 index대량의 데이터를 읽는 비효율적인 방식이므로 주의가 필요합니다.


🧠 Extra 컬럼에서 주의 깊게 볼 표현

표현 설명
Using where WHERE 조건을 사용함
Using index 인덱스만으로 결과를 가져옴 (커버링 인덱스) ✅
Using temporary 임시 테이블 생성 (성능 저하) ❌
Using filesort 정렬 연산 발생 (느림) ❌

MySQL Extra Column Visualization


🧪 MySQL 8.0 이상: EXPLAIN ANALYZE

MySQL 8.0 이상에서는 EXPLAIN ANALYZE 명령으로 쿼리를 실제 실행하며 실제 소요 시간과 처리 row 수를 보여줍니다.

EXPLAIN ANALYZE SELECT * FROM employees WHERE dept_no = 'd005';

EXPLAIN ANALYZE Output Tree


🔧 실행 계획 최적화를 위한 팁

  • ✅ WHERE 조건에 사용하는 컬럼에 적절한 인덱스 추가
  • SELECT * 대신 필요한 컬럼만 조회
  • ✅ 가능한 경우 커버링 인덱스 활용 (Using index)
  • Using temporary, Using filesort 피하기
  • ✅ 조인에서는 eq_ref, ref를 유지
  • ✅ 복잡한 서브쿼리는 JOIN으로 변경 고려

MySQL Index Optimization


📎 마무리

실행 계획은 단순한 쿼리 실행 설명이 아니라, 성능 최적화를 위한 핵심 정보입니다.
EXPLAINEXPLAIN ANALYZE를 통해 MySQL이 어떤 방식으로 데이터를 처리하는지 파악하고, 병목 지점을 찾아 개선해보세요.

728x90
반응형