쿼리 최적화 (Query Optimization)

데이터베이스 쿼리 최적화는 데이터베이스 시스템의 성능을 향상시키고 효율성을 높이기 위한 중요한 프로세스이다.

쿼리 최적화의 목적

주요 최적화 기법

인덱스 최적화

1
2
3
4
5
6
7
8
9
-- 자주 사용되는 조건절에 대한 인덱스 생성
CREATE INDEX idx_orders_amount_date ON orders(total_amount, order_date);

-- 위 인덱스를 활용하는 최적화된 쿼리
SELECT customers.name, orders.order_date, orders.total_amount
FROM orders  -- 인덱스를 가진 테이블을 먼저 참조
JOIN customers ON customers.id = orders.customer_id
WHERE orders.total_amount > 1000
ORDER BY orders.order_date DESC;

쿼리 재작성

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
-- 비효율적인 서브쿼리
SELECT *
FROM customers
WHERE id IN (
    SELECT customer_id
    FROM orders
    WHERE total_amount > 1000
);

-- 더 효율적인 조인으로 변환
SELECT DISTINCT c.*
FROM customers c
JOIN orders o ON c.id = o.customer_id
WHERE o.total_amount > 1000;

실행 계획 분석

쿼리 실행 계획은 데이터베이스가 쿼리를 어떻게 처리할지를 보여주는 로드맵과 같다.

1
2
3
4
5
6
EXPLAIN ANALYZE
SELECT customers.name, orders.order_date, orders.total_amount
FROM customers
JOIN orders ON customers.id = orders.customer_id
WHERE orders.total_amount > 1000
ORDER BY orders.order_date DESC;

이 쿼리의 실행 계획을 분석하면, 데이터베이스가 어떤 순서로 테이블을 읽고, 어떤 인덱스를 사용하는지 알 수 있다. 여기서 발견할 수 있는 비효율적인 부분들을 개선해나갈 수 있다.

조인 최적화

1
2
3
4
5
6
7
8
9
-- 작은 결과셋을 먼저 필터링하여 조인 성능 향상
SELECT c.name, o.order_date
FROM (
    SELECT customer_id, order_date
    FROM orders
    WHERE total_amount > 1000
    AND order_date >= '2024-01-01'
) o
JOIN customers c ON c.id = o.customer_id;

데이터 모델링 개선

캐싱 활용

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
-- 자주 사용되는 복잡한 쿼리 결과를 임시 테이블에 저장
CREATE TEMPORARY TABLE tmp_sales_summary AS
SELECT customer_id, 
       SUM(total_amount) as total_sales
FROM orders
GROUP BY customer_id;

-- 이후 임시 테이블 활용
SELECT *
FROM tmp_sales_summary
WHERE total_sales > 5000;

페이징 및 LIMIT 사용

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
-- 비효율적인 페이징
SELECT *
FROM orders
ORDER BY order_date DESC
LIMIT 10 OFFSET 1000000;

-- 더 효율적인 키셋 페이징
SELECT *
FROM orders
WHERE order_date < :last_seen_date
ORDER BY order_date DESC
LIMIT 10;

최적화 프로세스

  1. 성능 문제 식별
  2. 쿼리 분석 및 병목 지점 파악
  3. 최적화 전략 수립
  4. 최적화 기법 적용
  5. 성능 테스트 및 모니터링
  6. 결과 분석 및 추가 최적화

주의사항


참고 및 출처