
안녕하세요 이번 주제는 실무에서 바로 써먹는 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 #실전개발
'TIPS' 카테고리의 다른 글
| WHERE vs HAVING의 차이 – 언제 어떤 걸 써야 할까? (4) | 2025.08.18 |
|---|---|
| 실무에서 인덱스를 똑똑하게 활용하는 전략 (심화편) (14) | 2025.08.11 |
| 실무에서 자주 쓰이지만 까다로운 SQL 문법 정리 (8) | 2025.07.28 |
| Spark 실전 성능 튜닝 #Executor, #Shuffle, #GC (4) | 2025.07.21 |
| Hive + Spark 실무 — 대용량 조인 성능 튜닝 실전 예제 (4) | 2025.07.14 |