MySQL EXPLAIN 실행계획에서 가장 오해하기 쉬운 컬럼 중 하나가 바로 Extra 컬럼이다.
이 컬럼에는 쿼리 실행 중 발생하는 추가 작업이 텍스트로 출력되는데, 이를 해석하면 성능 병목을 빠르게 진단할 수 있다.

🔍 Extra 컬럼이란?
EXPLAIN 실행 시 나오는 각 행(row)의 마지막 컬럼으로, 쿼리 실행 중 MySQL이 수행하는 부가 작업 정보가 나타난다.
이 컬럼의 내용을 파악하면 인덱스 사용 여부, 임시 테이블 생성 여부, 정렬 작업 존재 여부 등을 확인할 수 있다.
🧩 자주 등장하는 Extra 문구 해석
1️⃣ Using where
조건절을 기반으로 필터링하고 있다는 의미다.
보통 인덱스를 사용하더라도 WHERE 조건으로 최종 필터링이 필요한 경우에 이 문구가 뜬다.
- 의미: 조건절이 실행 중 필터링에 사용됨
- 예시:
SELECT * FROM users WHERE age > 30;
- 최적화 팁: 인덱스를 추가해 조건절을 커버하면 좋다
2️⃣ Using index
커버링 인덱스(covering index)를 사용한 경우에 출력된다.
데이터 테이블을 직접 조회하지 않고, 인덱스에 포함된 컬럼만으로 결과를 반환하는 경우다.
- 성능: 매우 빠른 접근 방식
- 예시:
SELECT id, name FROM users WHERE id = 1;
- 인덱스(id, name)를 만들면 이 문구가 뜬다
Using where; Using index 같이 함께 나오는 경우도 있다 → 조건절 필터링은 필요하지만, 결과는 인덱스만으로 반환 가능함
3️⃣ Using temporary
MySQL이 내부적으로 임시 테이블을 생성해서 작업할 때 나타난다.
GROUP BY, DISTINCT, ORDER BY 등에서 자주 등장한다.
- 예시:
SELECT age FROM users GROUP BY age;
- 성능 이슈: 디스크 I/O 증가로 인해 성능 저하 가능
- 해결 팁:
- GROUP BY 컬럼에 인덱스 생성
- 정렬 기준에 맞는 covering index 적용
4️⃣ Using filesort
MySQL이 명시적인 인덱스를 사용하지 않고 정렬 작업을 직접 수행할 때 출력된다.
- 예시:
SELECT * FROM users ORDER BY name DESC;
- 문제점: 인덱스를 활용한 정렬이 아닌 → 메모리 or 디스크 정렬
- 해결 팁:
- ORDER BY 대상 컬럼에 인덱스 생성
- WHERE 조건 + ORDER BY 조합에 맞는 복합 인덱스 고려
5️⃣ Using join buffer (Block Nested Loop)
인덱스 없는 조인 수행 시 MySQL이 조인 버퍼를 사용하여 Block Nested Loop 방식으로 처리한 것을 의미한다.
- 예시:
SELECT * FROM users u
JOIN orders o ON u.id = o.user_id;
--이때 o.user_id에 인덱스가 없으면 Using join buffer가 뜬다
- 해결 팁:
- 조인 대상의 외래키에 인덱스 추가
- 조인 순서 최적화
🛠 Extra에서 주의해야 할 신호들
| 문구 | 성능 영향 | 대처 방법 |
| Using filesort | ❌ 높음 | 정렬 컬럼에 인덱스 |
| Using temporary | ❌ 높음 | GROUP BY, ORDER BY 컬럼에 인덱스 |
| Using join buffer | ⚠️ 중간 | 조인 키에 인덱스 추가 |
| Using where | ⚠️ 낮음 | 조건절 컬럼 인덱스 고려 |
| Using index | ✅ 좋음 | 커버링 인덱스 설계 활용 |
💡 실무 팁: Extra에 아무것도 없으면 좋은 것일까?
꼭 그렇지는 않다.
EXPLAIN 출력 결과 중 Extra가 NULL이거나 비어 있으면, MySQL이 특별한 추가 작업을 하지 않았다는 뜻이지만,
그 자체로 쿼리가 빠르다는 보장은 아니다.
항상 type, key, rows 등과 함께 종합적으로 분석해야 한다.
📚 공식문서 참고
'DB' 카테고리의 다른 글
| [MySQL] JOIN이 느릴 때 실행계획으로 튜닝하는 방법 (0) | 2025.07.04 |
|---|---|
| [MySQL] 실무 예제로 배우는 느린 쿼리 튜닝 실습 (EXPLAIN + INDEX 활용) (0) | 2025.07.04 |
| [MySQL] 효율적인 쿼리 작성법: 실행계획 튜닝을 고려한 SQL 설계 전략 🏗️ (1) | 2025.07.04 |
| [MySQL] 인덱스를 잘 써도 느린 이유? EXPLAIN으로 원인 분석하기 (1) | 2025.07.04 |
| [MySQL] key vs possible_keys vs rows 차이점 제대로 알기 🔍 (0) | 2025.07.04 |
| [MySQL] EXPLAIN 컬럼 완전정복: type, key, rows, Extra 해석법 🔬 (0) | 2025.07.04 |
| [MySQL] EXPLAIN이란? 실행계획을 확인하는 이유와 기본 구조 정리 🔍 (1) | 2025.07.04 |
| [MySQL] 실무에서 인덱스가 무시되는 이유와 해결법 완전 분석 (0) | 2025.07.03 |