실무에서 개발자가 자주 쓰는 쿼리(Query) 튜닝 모음

실무에서 자주 사용되는 쿼리 튜닝 기법들을 소개하는 글입니다. 데이터베이스 성능 최적화를 위해 자주 사용하는 기법을 구체적인 코드 예시와 함께 보여드리겠습니다. 쿼리 성능을 개선하고 문제를 해결할 수 있는 다양한 방법을 다루며, EXPLAIN 분석부터 인덱스 활용, 조인 최적화까지 폭넓게 다루겠습니다.


1. 인덱스 최적화

목표: 자주 조회되는 컬럼에 인덱스를 추가하여 쿼리 성능을 개선합니다.
설명: 인덱스는 데이터베이스 검색 성능을 크게 향상시킬 수 있습니다. 특히 WHERE, JOIN, ORDER BY 절에서 자주 사용되는 컬럼에 인덱스를 추가하면 성능을 크게 개선할 수 있습니다.

예시:

-- 자주 사용되는 컬럼에 인덱스 추가
CREATE INDEX idx_user_email ON users(email);

설명: 위의 예시처럼 이메일 컬럼에 인덱스를 추가하면, 이메일을 기준으로 검색할 때 성능이 향상됩니다.


2. EXPLAIN 분석

목표: 쿼리 실행 계획을 분석하여 성능을 개선합니다.
설명: EXPLAIN을 사용하면 쿼리의 실행 계획을 확인하고, 어떤 인덱스를 사용했는지, 테이블을 어떻게 조인했는지 등 성능 문제를 파악할 수 있습니다.

예시:

EXPLAIN SELECT * FROM orders WHERE customer_id = 123;

설명: EXPLAIN을 사용하여 쿼리 실행 계획을 확인하고, 어떤 인덱스를 사용하고 있는지, 테이블을 어떻게 스캔하고 있는지 파악합니다. 실행 계획을 통해 비효율적인 스캔이 발생하는 경우 인덱스를 추가하거나 쿼리 구조를 변경할 수 있습니다.


3. 서브쿼리 최적화

목표: 비효율적인 서브쿼리를 제거하거나 조인으로 변경하여 성능을 향상시킵니다.
설명: 서브쿼리는 때때로 성능 문제를 일으킬 수 있습니다. 특히 서브쿼리가 반복해서 실행되면 성능이 급격히 저하될 수 있습니다. 이를 해결하기 위해 서브쿼리를 조인으로 변경하는 것이 좋습니다.

예시:

-- 서브쿼리 사용 예
SELECT name, (SELECT AVG(score) FROM scores WHERE student_id = students.id) AS avg_score
FROM students;

최적화된 예:

-- 서브쿼리를 조인으로 최적화
SELECT students.name, AVG(scores.score) AS avg_score
FROM students
JOIN scores ON students.id = scores.student_id
GROUP BY students.id;

설명: 서브쿼리를 JOIN으로 변경하면 성능이 개선됩니다. AVG()GROUP BY를 활용해 결과를 한 번에 계산할 수 있습니다.


4. 불필요한 ORDER BY 최적화

목표: ORDER BY 절을 최소화하여 쿼리 성능을 개선합니다.
설명: **ORDER BY**는 결과를 정렬하는데 리소스를 많이 소모할 수 있습니다. 불필요한 정렬을 피하고, 필요한 경우에만 사용해야 합니다.

예시:

-- 불필요한 ORDER BY
SELECT * FROM orders WHERE order_date > '2025-01-01' ORDER BY order_date;

최적화된 예:

-- 필요한 경우에만 ORDER BY
SELECT * FROM orders WHERE order_date > '2025-01-01';

설명: 정렬이 필요하지 않은 경우 ORDER BY를 제거하면 성능을 크게 향상시킬 수 있습니다.


5. 집계 함수 최적화

목표: COUNT, SUM, AVG 등의 집계 함수 성능을 최적화합니다.
설명: 집계 함수는 데이터가 많을수록 성능이 저하될 수 있습니다. 이때는 분할 쿼리를 활용하거나 인덱스를 최적화하여 성능을 개선할 수 있습니다.

예시:

-- 집계 함수 최적화
SELECT COUNT(*) FROM orders WHERE order_date > '2025-01-01';

최적화 방법:

  1. 파티셔닝: 테이블을 날짜별로 파티셔닝하여 데이터를 분할 저장
  2. 인덱스 추가: order_date 컬럼에 인덱스를 추가하여 검색 속도 향상

6. 데이터 분할 처리 (파티셔닝)

목표: 대용량 데이터를 파티셔닝하여 성능을 개선합니다.
설명: 테이블을 날짜나 ID 등의 기준으로 파티셔닝하여 데이터를 분할 저장하면 쿼리 성능을 크게 향상시킬 수 있습니다.

예시:

-- 파티셔닝을 통해 테이블을 분할
CREATE TABLE orders (
id INT,
order_date DATE,
customer_id INT
) PARTITION BY RANGE (YEAR(order_date));

설명: 위와 같이 order_date를 기준으로 데이터를 파티셔닝하면, 특정 날짜 범위에 해당하는 데이터만 처리할 수 있어 성능이 크게 향상됩니다.


결론

위의 쿼리 튜닝 기법들을 실무에서 잘 활용하면 데이터베이스 성능을 크게 개선할 수 있습니다. 인덱스 활용, EXPLAIN 분석, 서브쿼리 최적화 등은 기본적으로 자주 사용되는 기법이니, 각 프로젝트에서 활용해 보세요.

Leave a Comment