MySQL에서 쿼리 최적화: 실행 계획 분석하기

 

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 명령어를 적극적으로 활용해 실행 계획을 분석하는 것이 중요합니다.
단순히 인덱스를 추가하는 것에서 나아가 쿼리 구조 자체를 재설계하는 것도 고려해 보세요.

특히 대용량 데이터를 다루는 서비스에서는 정기적으로 쿼리 성능을 모니터링하고, 실행 계획을 바탕으로 최적화 전략을 수립하는 습관이 중요합니다.