반응형
MySQL에서 쿼리 성능을 최적화하려면 EXPLAIN 명령어를 반드시 이해하고 활용해야 한다. 데이터가 많아질수록 단순한 SELECT 문 하나가 엄청난 성능 차이를 만들 수 있기 때문이다. 실행계획(EXECUTION PLAN)은 데이터베이스가 쿼리를 어떻게 처리할지에 대한 내부 전략을 보여준다.
특히 인덱스 활용 여부, 테이블 스캔 발생 유무, 조인의 순서 등을 확인할 수 있어 실무 튜닝에서 매우 중요하게 사용된다.
✅ EXPLAIN이란 무엇인가?
EXPLAIN 또는 EXPLAIN SELECT 문은 주어진 SQL 쿼리에 대해 MySQL이 어떤 방식으로 데이터를 가져올지에 대한 실행 전략을 출력한다.
EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';
위 명령어를 실행하면 MySQL은 해당 쿼리를 처리하기 위해 어떤 인덱스를 사용할지, 몇 건을 스캔할지 등을 테이블 형태로 출력한다.
반응형
🧩 왜 실행계획이 중요한가?
다음과 같은 이유로 실행계획은 실무에서 매우 중요하다.
- 인덱스를 제대로 타는지 확인 가능
- 불필요한 Full Table Scan 여부 확인
- JOIN 순서와 방식 확인
- 서브쿼리/뷰 성능 이슈 분석 가능
즉, 쿼리 성능 문제를 발견하고 해결하는 거의 유일한 단서가 실행계획이다.
🧾 EXPLAIN 기본 출력 컬럼 해설
EXPLAIN 명령어를 실행하면 아래와 같은 주요 컬럼이 출력된다.
컬럼 이름 | 설명 |
id | 쿼리의 순서를 나타내며, JOIN이나 서브쿼리에서 중요한 역할을 한다 |
select_type | 단순 SELECT인지, 서브쿼리인지, UNION인지 등을 알려준다 |
table | 액세스되는 테이블 이름 |
type | 조인의 타입으로, 성능에 큰 영향을 주는 컬럼이다 |
possible_keys | 사용할 수 있는 인덱스 목록 |
key | 실제 사용된 인덱스 |
rows | MySQL이 처리할 것으로 예측한 행 수 |
Extra | 추가적인 정보, 예: Using where, Using filesort 등 |
🔍 주요 컬럼 미리보기 예시
EXPLAIN SELECT * FROM orders WHERE user_id = 1;
id | select_type | table | type | possible_keys | key | rows | Extra |
1 | SIMPLE | orders | ref | user_id_idx | user_id_idx | 1 | Using where |
이처럼 key에 인덱스가 명확하게 지정되어 있고, type이 ref이므로 비교적 효율적인 쿼리임을 알 수 있다.
반응형
📌 EXPLAIN을 활용한 문제 해결 포인트
- type이 ALL이면 위험: Full Table Scan 발생 가능
- key가 NULL이면 인덱스 미사용
- rows 수치가 지나치게 크면 느린 쿼리 의심
- Extra에 Using temporary, Using filesort 있으면 튜닝 대상
이러한 항목은 모두 SQL 최적화의 신호등이라 할 수 있다. 쿼리 하나하나의 실행계획을 점검하는 습관을 들이면 전체 시스템 성능도 향상된다.
🧠 EXPLAIN 사용 시 참고 팁
- EXPLAIN ANALYZE를 사용하면 실제 실행 시간까지 확인할 수 있다 (MySQL 8.0 이상)
- SHOW WARNINGS 명령어로 더 상세한 설명 확인 가능
- 뷰나 서브쿼리를 사용할 경우, 복잡한 쿼리 구조에서는 FORMAT=JSON 형태로 실행계획 분석도 가능
📚 참고 문서
반응형
'DB' 카테고리의 다른 글
[MySQL] 인덱스를 잘 써도 느린 이유? EXPLAIN으로 원인 분석하기 (1) | 2025.07.04 |
---|---|
[MySQL] Extra 컬럼에 자주 뜨는 문구 해석법 (Using temporary 등) 🧐 (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] 실무에서 인덱스가 무시되는 이유와 해결법 완전 분석 (0) | 2025.07.03 |
[MySQL] EXPLAIN으로 인덱스 성능 튜닝하는 법 (실행계획 완전 분석) (0) | 2025.07.03 |
[MySQL] 인덱스 설계 가이드: 실무에서 실패하지 않는 인덱스 전략 🛠️ (0) | 2025.07.03 |
[MySQL] 인덱스 종류 완전정복 (BTREE, HASH, FULLTEXT, SPATIAL)🧩 (0) | 2025.07.03 |