MySQL 쿼리 최적화 방법 10가지

실무에서 답도없는 쿼리들 보면 정말 짜증이 치밀어 오르고 전 실무자에게 전화를 걸고 싶어져요...
MySQL 성능 문제는 대부분 쿼리 비효율에서 시작됩니다.
화를 삭이며 이번 글에서는 실무에서 바로 적용할 수 있는 10가지 최적화 방법을 정리했습니다.
- 인덱스(Index) 활용
- EXPLAIN로 실행 계획 확인
- SELECT * 피하기
- JOIN 최적화
- 서브쿼리 대신 JOIN 사용
- LIMIT 사용으로 불필요한 데이터 제한
- WHERE 조건 순서 및 함수 사용 최적화
- 정규화·비정규화 적절히 활용
- 배치 처리와 트랜잭션 관리
- 쿼리 캐시 및 MySQL 설정 튜닝
1. 인덱스(Index) 활용
검색 조건(WHERE, JOIN, ORDER BY)에 사용되는 컬럼에는 인덱스를 걸어 조회 속도를 높일 수 있죠.
하지만 이미 많은 데이터가 있는 테이블에 인덱스 추가는 무리 일 수 있어요.
기존 테이블에 인덱스 추가는 신중해야 합니다.
CREATE INDEX idx_user_email ON users(email);
주의: 인덱스가 많으면 쓰기(INSERT/UPDATE) 성능에 영향.
2. EXPLAIN으로 실행 계획 확인
쿼리 성능을 분석할 때는 EXPLAIN을 활용하여 인덱스 사용 여부, 테이블 스캔 여부 등을 확인합니다.
EXPLAIN SELECT * FROM orders WHERE user_id = 100;
3. SELECT * 피하기
아스타로 조회는 가급적 피하는 이유 아시죠?? 유지보수 할 때 무서워서 컬럼 추가를 못해요... 그리고 필요한 컬럼만 조회하면 네트워크, 메모리, 디스크 I/O를 절약할 수 있습니다. 여러모로 코딩할 때 아스타는 쓰지 맙시다...
SELECT id, name, email FROM users WHERE status='active';
4. JOIN 최적화
JOIN 시 작은 테이블 → 큰 테이블 순으로, 인덱스가 걸린 컬럼을 사용하여 성능을 높입니다.
5. 서브쿼리 대신 JOIN 사용
서브쿼리는 성능이 떨어질 수 있으므로 가능하면 JOIN으로 대체합니다.
또한 쿼리에 함수 굳이 안써도 되면 쓰지 맙시다...
-- 서브쿼리
SELECT name FROM users WHERE id IN (SELECT user_id FROM orders);
-- JOIN
SELECT u.name FROM users u JOIN orders o ON u.id = o.user_id;
6. LIMIT 사용
조회 결과가 많을 때, 페이지네이션 등으로 LIMIT를 활용하면 불필요한 데이터를 줄일 수 있습니다.
SELECT id, name FROM users ORDER BY created_at DESC LIMIT 50;
7. WHERE 조건 최적화
컬럼에 함수를 적용하면 인덱스가 무효화될 수 있으므로 주의합니다.
이거 핵심이에요... 인덱스가 없어도 쓸데없는 함수 사용 시 쿼리 지옥으로 가는 거에요.
-- 비효율
WHERE DATE(created_at) = '2025-11-18'
-- 효율적
WHERE created_at >= '2025-11-18 00:00:00' AND created_at < '2025-11-19 00:00:00'
8. 정규화/비정규화 적절히 활용
조인 과부하가 많다면, 일부 데이터를 비정규화하여 조회 속도를 높이는 것도 고려할 수 있습니다.
처음 설계할때 잘좀 합시다!
9. 배치 처리 및 트랜잭션 관리
대량 INSERT/UPDATE는 한 번에 처리하지 말고 배치 처리하거나 트랜잭션을 나누어 잠금과 로그 부담을 줄입니다.
10. 쿼리 캐시 및 MySQL 설정 튜닝
MySQL 설정(max_connections, query_cache_size, innodb_buffer_pool_size 등)을 조정하면 반복 조회 성능이 향상됩니다.
마무리
MySQL 쿼리 최적화는 단순한 기술보다 전체 설계·인덱스·실행 계획·데이터 패턴을 종합적으로 고려해야 합니다.
위 10가지 방법을 체크리스트로 활용하면 실무에서 성능 향상을 빠르게 확인할 수 있습니다.
사실 첨부터 잘 설계하는게 베스트지만 어쩔 수 있나요? 다 뒤집고 다시 시작하는게 최고라지만
대표는 그렇게 생각 못하니까유...
'개발 · IT > 백엔드' 카테고리의 다른 글
| Redis TTL & SETEX 완전 정리 — 개념 · 명령어 · 실전 예제 (0) | 2025.11.19 |
|---|---|
| Redis 캐싱 구조와 활용 예제 (0) | 2025.11.18 |
| 트랜잭션 ACID 쉽게 이해하기 — 핵심 개념 · 예시 · 실무 팁 (0) | 2025.11.17 |
| 조인(LEFT / INNER / RIGHT) 완전 정리 — 개념 · 예제 · 활용 팁 (0) | 2025.11.17 |
| DB 인덱스 개념과 성능 비교 — 쉽게 이해하는 실전 가이드 (0) | 2025.11.16 |
댓글