본문 바로가기

TIPS

실무에서 바로 써먹는 SQL 쿼리 성능 개선 팁

728x90
반응형
SMALL

 

 

안녕하세요 이번 주제는 실무에서 바로 써먹는 SQL 쿼리 성능 개선 팁 입니다.

SQL 쿼리는 단순히 동작하는 것보다 "빠르게" 동작해야 실무에 적합합니다.

대용량 테이블에서 성능 병목을 줄이기 위해 고려해야 할 몇 가지 실전 팁을 소개합니다.

 

 


SELECT * 사용 금지

왜 문제인가요?

  • 불필요한 I/O 발생
  • 인덱스를 무효화할 수 있음
  • 네트워크 전송량 증가

 

대안

SELECT user_id, user_name FROM user_table;
 

인덱스 타기 위한 WHERE 절 조건 정교화

좋은 예:

SELECT * FROM orders WHERE order_date >= '2024-01-01';
 

나쁜 예 (함수 사용으로 인덱스 미사용) :

SELECT * FROM orders WHERE TO_CHAR(order_date, 'YYYY') = '2024';
 

: 인덱스를 타려면 컬럼에 직접 조건을 줘야 합니다.


IN vs EXISTS vs JOIN 성능 비교
상황
추천
작은 서브쿼리
IN 사용
큰 서브쿼리
EXISTS 또는 JOIN
데이터 중복 제거 필요
JOIN + DISTINCT 또는 EXISTS

 

예시 (EXISTS가 유리한 경우):

SELECT name FROM users u
WHERE EXISTS (
  SELECT 1 FROM orders o WHERE o.user_id = u.id
);
 

서브쿼리보다 JOIN이 유리한 경우
-- 서브쿼리 방식
SELECT name FROM users WHERE id IN (SELECT user_id FROM orders);

-- JOIN 방식 (더 빠름)
SELECT DISTINCT u.name FROM users u
JOIN orders o ON u.id = o.user_id;
 

LIMIT 사용 시 ORDER BY 고려

ORDER BY 없이 LIMIT 사용 시

  • 결과가 예측 불가 (성능은 좋음)

ORDER BY와 함께 사용 시

 

SELECT * FROM logs ORDER BY created_at DESC LIMIT 10;
 

→ 인덱스를 잘 설계해야 함 (created_at DESC로 구성된 인덱스)

 


조건절 함수 사용 금지

X

WHERE DATE(created_at) = '2025-08-01'
 

O

WHERE created_at >= '2025-08-01' AND created_at < '2025-08-02'
 

→ 함수 제거 시 인덱스 효율적으로 사용 가능


임시 테이블 (Temp Table) 사용 전략

대규모 중간 결과 재사용 시 유리

  • 반복적인 계산 제거
  • 복잡한 조인을 단순화
CREATE TEMPORARY TABLE temp_result AS
SELECT user_id FROM actions WHERE action_type = 'login';

SELECT * FROM users u
JOIN temp_result t ON u.id = t.user_id;
 

정렬, 그룹핑 전에 인덱스 확인

GROUP BY, ORDER BY 는 정렬 비용이 크므로 정렬 대상 컬럼에 인덱스가 있는지 확인하세요.

-- created_at에 인덱스가 없으면 정렬 비용 ↑
SELECT COUNT(*) FROM logs GROUP BY created_at;
 

쿼리 실행계획(Explain Plan) 보는 습관
EXPLAIN SELECT * FROM orders WHERE user_id = 123;
 
  • type: index 또는 range 이면 좋음
  • type: ALL → 풀스캔 (성능 문제 있음)

 


불필요한 DISTINCT 남발 금지
  • 중복 제거는 CPU/메모리 비용 ↑
  • 조인 전에 중복을 줄이거나, 로직에서 처리할 수 있는지 검토

 


마무리

실무에서는 쿼리 하나가 전체 서비스의 병목이 될 수 있습니다.

코드를 잘 짜는 것도 중요하지만, 데이터 조회가 병목이면 결국 사용자에게는 느린 서비스로 보입니다.

오늘 소개한 팁들은 간단하지만 실제 프로젝트에서 매우 큰 효과를 냅니다.

 

 

 

 

 

학스의 개발일지

일상과 코딩 그 사이 어딘가에있는 블로그.. 블로거이자 빅데이터개발자 학스 입니다 JAVA, jQuery, PostgreSQL, MySQL, HIVE, Hadoop 더 많은 정보는 깃허브 주소 https://github.com/hacs2772 를 방문해주세요

hacs2772.tistory.com

 

#SQL성능 #쿼리최적화 #인덱스활용 #실무SQL #DB튜닝 #java공부 #MySQL #PostgreSQL #실전개발

728x90
반응형
LIST