MySQL 슬로우 쿼리 로그 (Slow Query log) 설정 – 성능 개선의 숨겨진 열쇠

데이터베이스 성능은 웹 서비스, 애플리케이션의 속도와 직결됩니다. 느린 데이터베이스 쿼리는 사용자 경험을 저하시키고, 서비스 장애로 이어질 수 있습니다. 이 문제 해결을 위한 강력한 도구 중 하나가 바로 MySQL 슬로우 쿼리 (Slow Query) 로그이며, 설정 확인까지 소개합니다.

1. MySQL 슬로우 쿼리 로그? (MySQL Slow Query log)

MySQL 슬로우 쿼리 로그(Slow Query Log)설정된 시간 이상 걸리는 SQL 쿼리를 자동으로 기록하는 기능입니다.
이 로그에는 쿼리 실행 시간, 실행된 SQL 문, 사용자 정보, 조회된 행 수 등이 포함됩니다.

이를 분석하면 병목 쿼리, 인덱스 미사용, 전체 테이블 스캔 등 성능 저하 원인을 쉽게 파악할 수 있습니다.

슬로우 쿼리 로그가 중요한 이유

구분설명
문제 쿼리 식별실행 시간이 긴 쿼리를 찾아 성능 개선 우선순위를 정할 수 있습니다.
병목 현상 분석쿼리 실행 시간 분석을 통해 서버의 병목 구간을 파악합니다.
리소스 절약불필요하게 CPU, 메모리, 디스크를 소모하는 쿼리를 개선할 수 있습니다.
장애 예방잠재적인 성능 문제를 조기에 감지하여 장애를 예방합니다.
개발 효율성 향상개발자가 쿼리 성능을 스스로 점검하고 최적화하도록 유도합니다.
MySQL 슬로우 쿼리 로그 (Slow Query log)
MySQL 슬로우 쿼리 로그 (Slow Query log) 설정 - 성능 개선의 숨겨진 열쇠 4

2. MySQL 슬로우 쿼리 로그 설정 및 분석 도구

MySQL 슬로우 쿼리 로그 설정

MySQL 슬로우 쿼리 로그는 MySQL 설정 파일(my.cnf 또는 my.ini)을 수정하거나, MySQL 클라이언트 명령어로 동적으로 설정할 수 있습니다.

방법 1. 설정 파일에서 영구적으로 설정

MySQL 설정 파일(my.cnf)의 [mysqld] 섹션에 다음 내용을 추가합니다.

[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
log_output = FILE
설정 항목설명
slow_query_log = 1Slow Query 로그 기능 활성화
slow_query_log_file로그 파일 저장 경로 지정
long_query_time = 22초 이상 걸리는 쿼리를 기록 (단위: 초)
log_output = FILE로그를 파일 형태로 저장

⚠️ 설정 변경 후에는 반드시 MySQL 서버 재시작이 필요합니다.

sudo systemctl restart mysql

방법 2. MySQL 클라이언트에서 동적으로 설정

서버 재시작 없이 즉시 적용하려면, MySQL 콘솔에 접속 후 다음 명령을 입력합니다.

SET GLOBAL slow_query_log = 'ON';
SET GLOBAL slow_query_log_file = '/var/log/mysql/mysql-slow.log';
SET GLOBAL long_query_time = 2;
SET GLOBAL log_output = 'FILE';

단, 이 방식은 서버 재시작 시 초기화되므로
영구 적용하려면 반드시 설정 파일에도 반영해야 합니다.

슬로우 쿼리 로그 분석 도구

Slow Query 로그는 일반 텍스트 파일로 저장되지만,
전문 도구를 활용하면 훨씬 효율적으로 분석할 수 있습니다.

도구명특징
mysqldumpslowMySQL 기본 내장 도구, 로그를 요약 및 정렬하여 표시
pt-query-digestPercona Toolkit 도구, 실행 빈도·시간·쿼리 통계 등을 시각적으로 분석
MySQL Enterprise MonitorMySQL 공식 유료 모니터링 툴, GUI 기반의 실시간 분석 제공

3. 슬로우 쿼리 로그 분석 예제

1️⃣ 인덱스 미사용 쿼리

# Time: 2023-10-27T10:00:00.000000Z
User@Host: user[user] @ localhost []
Query_time: 5.000000 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 1000000
SELECT * FROM users WHERE email = 'test@example.com';
  • Rows_examined가 매우 크다는 것은 테이블 전체 스캔을 의미합니다.
  • 해결 방법: 인덱스 추가
ALTER TABLE users ADD INDEX idx_email (email);

2️⃣ N+1 문제

비슷한 쿼리가 반복적으로 실행되는 경우, Slow Query 로그에 다음과 같이 나타납니다:

SELECT * FROM orders WHERE user_id = 1;
SELECT * FROM products WHERE id = 1;
SELECT * FROM products WHERE id = 2;
...
  • 문제: 매 요청마다 반복 쿼리가 발생 (N+1 문제)
  • 해결: JOIN 쿼리 사용 또는 캐시 적용으로 DB 접근 최소화

3️⃣ 불필요한 전체 테이블 스캔

# Time: 2023-10-27T10:02:00.000000Z
Query_time: 10.000000 Rows_sent: 1000000 Rows_examined: 1000000
SELECT * FROM users;
  • WHERE 절 없이 테이블 전체를 읽는 비효율적인 쿼리
  • 해결: 쿼리 목적 명확화 및 WHERE 절 추가
MySQL 슬로우 쿼리 로그 (Slow Query log) 설정 - MySQL Workbench 쿼리 성능 개선
MySQL 슬로우 쿼리 로그 (Slow Query log) 설정 - 성능 개선의 숨겨진 열쇠 5

4. MySQL 슬로우 쿼리 로그 실제 활용 팁

항목설명
적절한 long_query_time 설정너무 짧으면 로그 과다, 너무 길면 문제 쿼리 누락 — 일반적으로 1~5초 권장
로그 파일 로테이션로그가 커지지 않도록 주기적으로 압축/삭제
정기 분석로그를 주기적으로 검토해 성능 저하를 사전 감지
EXPLAIN 명령 활용실행 계획을 확인해 인덱스 사용 여부, JOIN 순서 등을 분석
튜닝 도구 병행MySQL Workbench, Percona Toolkit 등으로 쿼리 성능 개선

오해와 사실

오해실제 사실
Slow Query 로그가 모든 성능 문제를 해결한다로그는 문제 식별 도구일 뿐, 해결은 개발자의 최적화 역량에 달려 있음
로그를 켜면 성능이 저하된다영향은 미미하지만, 로그가 너무 크면 디스크 I/O 증가 가능
모든 Slow Query를 고쳐야 한다실행 빈도와 영향도를 고려해 우선순위를 정해야 효율적

전문가의 조언

  • 인덱스 전략 수립: 쿼리 패턴에 따라 효율적인 인덱스 구조 설계
  • 정규화 & 비정규화 균형: 데이터 접근 성능과 관리 효율을 함께 고려
  • 캐싱 전략 활용: Redis, Memcached 등으로 DB 부하 완화
  • 서버 튜닝: buffer_pool_size, connection_limit 등 파라미터 조정
  • 지속적인 모니터링: 성능 이상 징후를 조기에 탐지

효율적인 운영 팁

방법설명
오픈소스 도구 활용mysqldumpslow, pt-query-digest 등 무료 도구로 분석 비용 절감
클라우드 기반 모니터링AWS CloudWatch, Google Cloud Monitoring 등으로 로그 분석 자동화
자동화된 분석 파이프라인주기적으로 로그를 수집·분석·시각화하여 인력 소모 최소화

5. 마무리 한마디

Slow Query 로그는 단순한 로그가 아니라, 데이터베이스 성능 개선의 출발점입니다.
정기적으로 로그를 분석하고, 인덱스·쿼리·구조를 최적화한다면 서버 부하를 줄이고, 응답 속도를 크게 개선할 수 있습니다.

“문제를 기록하지 않으면 개선할 수도 없다.”
Slow Query 로그는 바로 그 문제의 ‘기록지’입니다.

Q1. 로그 파일이 너무 커질 때는?

→ 로그 로테이션을 설정하고 오래된 로그는 압축 또는 삭제하세요.

Q2. long_query_time은 얼마로 설정해야 하나요?

→ 서비스 특성에 따라 다르지만 1~5초 범위에서 시작해 점진적으로 조정하는 것이 좋습니다.

Q3. 분석 도구를 쓰면 좋은 점은?

→ 사람이 직접 보기 어려운 패턴, 빈도, 실행 시간 통계를 자동으로 시각화해줍니다.

이 게시물이 얼마나 유용했나요?

별을 클릭해 평가해주세요.

평균 평점: 4.9 / 5. 총 투표 수: 7

아직 평가가 없습니다. 첫 번째 평가자가 되어보세요!

댓글 남기기

error: ⚠ 복사/선택이 차단된 콘텐츠입니다.

광고 차단 알림

광고 클릭 제한을 초과하여 광고가 차단되었습니다.

단시간에 반복적인 광고 클릭은 시스템에 의해 감지되며, IP가 수집되어 사이트 관리자가 확인 가능합니다.