MySQL에서 쿼리 성능이 느릴 때 가장 먼저 확인해야 할 도구가 바로 EXPLAIN입니다. EXPLAIN 명령어는 쿼리가 어떻게 실행되는지, 어떤 인덱스를 사용하는지, 테이블을 어떤 순서로 접근하는지 등을 분석해주는 유용한 도구입니다.
EXPLAIN의 기본 구조와 주요 컬럼의 의미, 쿼리 튜닝을 위한 실전 활용 팁까지 자세히 알아보겠습니다.
1. EXPLAIN 명령어란?
EXPLAIN
또는 EXPLAIN ANALYZE
는 MySQL에서 쿼리를 실행하기 전에 어떤 방식으로 데이터를 가져올지 계획을 보여주는 명령어입니다.
사용 예:
EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';
2. EXPLAIN 결과에서 주의 깊게 볼 항목
항목 | 설명 |
---|---|
id | SELECT의 순서를 나타냅니다. 복잡한 쿼리일수록 여러 개의 id가 나옵니다. |
select_type | 기본 SELECT, 서브쿼리 등 쿼리 유형을 나타냅니다. |
table | 접근하는 테이블 이름 |
type | 조인 방식이며, 성능에 큰 영향을 미칩니다. ALL 은 풀스캔으로 성능이 좋지 않습니다. |
possible_keys | 사용 가능성이 있는 인덱스 목록 |
key | 실제로 사용된 인덱스 |
rows | MySQL이 추정한 읽어야 할 행(row)의 수 |
Extra | 추가 정보로, Using where , Using index 등의 정보를 표시합니다. |
3. 자주 보는 비효율 패턴 예시
예시 1: Full Table Scan (type = ALL)
EXPLAIN SELECT * FROM products WHERE category = 'A';
→ type = ALL
이면 인덱스를 사용하지 않고 전체 테이블을 읽는다는 뜻입니다.
해결책: category
컬럼에 인덱스를 생성합니다.
예시 2: Index Not Used
EXPLAIN SELECT * FROM orders WHERE DATE(order_date) = '2023-01-01';
→ DATE()
함수 사용 시 인덱스를 무효화합니다.
해결책: order_date BETWEEN '2023-01-01 00:00:00' AND '2023-01-01 23:59:59'
로 변경.
4. EXPLAIN ANALYZE로 실행 시간까지 확인
MySQL 8.0 이상에서는 EXPLAIN ANALYZE
를 사용해 실제 실행 시간, 버퍼 읽기, 처리 시간 등을 확인할 수 있습니다.
EXPLAIN ANALYZE SELECT * FROM users WHERE email = 'test@example.com';
→ 결과는 JSON 형식으로 출력되며, 실제 실행 시간까지 제공하여 병목 구간 파악에 유용합니다.
5. 쿼리 최적화를 위한 팁
- WHERE 절에 사용하는 컬럼에는 인덱스 적용
- JOIN 시에는 조인 대상 컬럼에도 인덱스 생성
- SELECT * 대신 필요한 컬럼만 선택
- LIMIT 사용 시 ORDER BY 컬럼에도 인덱스 적용
- 서브쿼리 대신 JOIN으로 변경 고려
MySQL에서 쿼리 성능을 최적화하려면 EXPLAIN 명령어를 적극적으로 활용해 실행 계획을 분석하는 것이 중요합니다.
단순히 인덱스를 추가하는 것에서 나아가 쿼리 구조 자체를 재설계하는 것도 고려해 보세요.
특히 대용량 데이터를 다루는 서비스에서는 정기적으로 쿼리 성능을 모니터링하고, 실행 계획을 바탕으로 최적화 전략을 수립하는 습관이 중요합니다.
'개발 > DB' 카테고리의 다른 글
MySQL에서 대용량 데이터 처리 최적화 방법: 성능을 높이는 실전 팁 (0) | 2025.08.29 |
---|---|
MySQL에서 자동화된 스케줄러 사용하기 (1) | 2025.08.28 |
MySQL에서 SQL Injection 방어 방법 (1) | 2025.08.26 |
MySQL에서 데이터베이스 보안 강화 방법 (0) | 2025.08.25 |
MySQL에서 사용자 관리 및 권한 부여 (0) | 2025.08.24 |