MySQL에서 고급 쿼리 최적화 기법

 

단순한 SQL 쿼리를 빠르게 실행하는 것은 쉽지만, 복잡한 비즈니스 로직대용량 데이터가 결합되면 성능 저하가 발생하기 쉽습니다. MySQL 쿼리 성능을 극대화하기 위한 고급 최적화 기법을 정리해 보겠습니다.

 

1. 실행 계획(EXPLAIN) 분석하기

EXPLAIN 명령어는 쿼리가 실제로 어떤 방식으로 실행되는지를 보여줍니다. type, key, rows, Extra 필드를 중점적으로 확인하세요.

EXPLAIN SELECT * FROM orders WHERE customer_id = 10;
  • type: 가능한 한 ref, range 또는 const가 되도록
  • rows: 예측되는 처리 건수가 많을수록 성능 저하
  • Extra: “Using index”는 좋고, “Using temporary”나 “Using filesort”는 주의

2. 인덱스 전략 고도화

  • 다중 컬럼 인덱스: WHERE, ORDER BY, GROUP BY 절에 자주 등장하는 컬럼을 조합
  • Covering Index: 필요한 컬럼이 모두 인덱스에 포함되도록 하여 테이블 접근 최소화
  • 불필요한 인덱스 제거: 쓰이지 않는 인덱스는 오히려 쓰기 성능 저하
CREATE INDEX idx_orders_customer_date ON orders(customer_id, order_date);

3. 서브쿼리 대신 JOIN 또는 EXISTS 사용

서브쿼리는 반복 실행될 수 있기 때문에 성능에 큰 영향을 줄 수 있습니다. 가급적 JOIN 또는 EXISTS 문으로 대체하는 것이 좋습니다.

-- 비효율적인 서브쿼리
SELECT name FROM users WHERE id IN (SELECT user_id FROM logs WHERE action = 'login');

-- 효율적인 JOIN
SELECT u.name
FROM users u
JOIN logs l ON u.id = l.user_id
WHERE l.action = 'login';
  

4. JOIN 순서와 조건 최적화

  • 필터링 범위가 좁은 테이블부터 JOIN
  • ON 조건에 인덱스 컬럼 포함
  • 불필요한 LEFT JOIN 제거

5. LIMIT + ORDER BY 성능 개선

많은 양의 데이터를 정렬하고 나서 LIMIT을 적용하면 느려집니다. 인덱스 활용 또는 WHERE + ORDER BY + LIMIT 조합으로 최적화하세요.

-- 느린 방식
SELECT * FROM posts ORDER BY created_at DESC LIMIT 10;

-- 빠른 방식
SELECT * FROM posts
WHERE created_at < '2023-01-01'
ORDER BY created_at DESC
LIMIT 10;
  

6. 데이터 분할 및 파티셔닝 고려

테이블이 너무 커지면 파티션을 활용하거나, 시간별 테이블 분할로 성능을 높일 수 있습니다. 실시간 분석 테이블은 분리하여 운영하는 것이 좋습니다.

7. 뷰(View)와 저장 프로시저 활용

  • 복잡한 쿼리를 재사용 가능한 View로 분리
  • 로직 처리를 서버로 넘기지 않고 DB 안에서 처리하는 저장 프로시저 활용

8. 실시간 모니터링 도구 활용

  • SHOW PROCESSLIST로 실행 중 쿼리 확인
  • performance_schema 또는 MySQL Enterprise Monitor 활용
  • 슬로우 쿼리 로그(slow query log)로 병목 쿼리 추적

 

 

MySQL 쿼리 최적화는 단순히 인덱스를 추가하는 것을 넘어, 실행 계획 분석, 쿼리 재작성, 인프라 구조 고려까지 포함하는 고급 작업입니다. 반복 쿼리나 대용량 데이터를 다룰 경우, 위의 전략을 적용해보시기 바랍니다.