Slow Query: 성능 저하의 주범

김기현·2025년 6월 19일

Database

목록 보기
24/24

느린 쿼리는 데이터베이스 성능 저하의 주범이다. 이를 식별하고 분석하는 방법은 아래와 같은 순서로 진행할 수 있다.

1. 느린 쿼리의 일반적인 징후

  • 반응 시간이 길다
  • CPU 사용률 또는 디스크 I/O 급증
  • DB 연결 수가 급격히 증가
  • 웹 요청이 지연되거나 타임아웃 발생
  • DB 락이 자주 발생

2. 느린 쿼리 식별 방법

슬로우 쿼리 로그(Slow Query Log) 활성화

-- 슬로우 쿼리 로그 활성화
SET GLOBAL slow_query_log = 1;

-- 슬로우 쿼리 저장 경로 확인
SHOW VARIABLES LIKE 'slow_query_log_file';

-- 특정 시간 이상 걸리는 쿼리만 기록 (예: 1초 이상)
SET GLOBAL long_query_time = 1;

로그 파일 확인

로그는 일반적으로 /var/lib/mysql/ 또는 /var/log/mysql에 생성된다.

cat /var/lib/mysql/slow.log

mysqldumpslow 명령어로 요약

mysqldumpslow -s t /var/lib/mysql/slow.log

pt-query-digest (Percona Toolkit)사용

정밀한 분석 도구로, 쿼리 유형별 통계를 제공한다.

pt-query-digest /var/lib/mysql/slow.log

3. 실행 계획 (Execution Plan) 분석

EXPLAIN 또는 EXPLAIN ANALYZE

EXPLAIN
SELECT *
FROM user
WHERE email = 'example@naver.com';
  • type가 ALL이면 테이블 전체 스캔
  • key 사용 안 함: 인덱스 미사용
  • row 수치가 높음: 많은 데이터 검색

4. 느린 쿼리의 대표적인 원인

원인설명
인덱스 없음WHERE 조건, JOIN 조건에 인덱스 없음
LIKE '%검색어%'인덱스 무시됨
ORDER BY + LIMIT정렬 + 슬라이싱이 느림
너무 많은 JOIN불필요한 조인이나 N:M 조인
서브쿼리 사용비효율적인 중첩 쿼리
데이터 양 많음테이블이 커졌는데 최적화 미실시
함수 인덱스 안 씀WHERE DATE(created_at) 같은 인덱스 무효화

5. 느린 쿼리 최적화 전후 비교 팁

항목설명
실행 계획EXPLAIN 전후 비교
실행 시간SHOW PROFILE, ANALYZE, 또는 ORM log
IO 횟수디스크 액세스 횟수 줄이기
쿼리 캐시 활용MySQL에서는 query_cache가 사용 가능 (MySQL 5.x)
결과 개수불필요하게 많은 결과를 가져오지 않도록 LIMIT 등 사용

만약 ORM을 사용한다면?

  • 로그로 쿼리 추적
    • spring.jpa.show-sql=true
    • logging.level.org.hibernate.SQL=DEBUG
  • Hibernate Statistics 또는 p6spy 사용
  • N+1 문제 감지(지연 로딩, 연관관계 확인)

6. 실시간 모니터링 도구

도구설명
APM (NewRelic, Datadog, Pinpoint)느린 요청/쿼리 자동 식별
MySQL Enterprise Monitor슬로우 쿼리 탐지 기능
pg_stat_statements (PostgreSQL)가장 무거운 쿼리 확인 가능
Grafana + Prometheus쿼리 시간 그래프화 가능

결론

느린 쿼리를 식별하려면 다음과 같은 단계적인 접근이 중요하다.

  1. 로그/모니터링으로 느린 쿼리 추적
  2. EXPLAIN으로 실행 계획 분석
  3. 쿼리 구조, 인덱스, 데이터량 점검
  4. 쿼리 최적화 후 성능 비교
profile
백엔드 개발자를 목표로 공부하는 대학생

0개의 댓글