데이터베이스 성능은 웹 서비스, 애플리케이션의 속도와 직결됩니다. 느린 데이터베이스 쿼리는 사용자 경험을 저하시키고, 서비스 장애로 이어질 수 있습니다. 이 문제 해결을 위한 강력한 도구 중 하나가 바로 MySQL 슬로우 쿼리 (Slow Query) 로그이며, 설정 확인까지 소개합니다.
1. MySQL 슬로우 쿼리 로그? (MySQL Slow Query log)
MySQL 슬로우 쿼리 로그(Slow Query Log) 는 설정된 시간 이상 걸리는 SQL 쿼리를 자동으로 기록하는 기능입니다.
이 로그에는 쿼리 실행 시간, 실행된 SQL 문, 사용자 정보, 조회된 행 수 등이 포함됩니다.
이를 분석하면 병목 쿼리, 인덱스 미사용, 전체 테이블 스캔 등 성능 저하 원인을 쉽게 파악할 수 있습니다.
슬로우 쿼리 로그가 중요한 이유
| 구분 | 설명 |
|---|---|
| 문제 쿼리 식별 | 실행 시간이 긴 쿼리를 찾아 성능 개선 우선순위를 정할 수 있습니다. |
| 병목 현상 분석 | 쿼리 실행 시간 분석을 통해 서버의 병목 구간을 파악합니다. |
| 리소스 절약 | 불필요하게 CPU, 메모리, 디스크를 소모하는 쿼리를 개선할 수 있습니다. |
| 장애 예방 | 잠재적인 성능 문제를 조기에 감지하여 장애를 예방합니다. |
| 개발 효율성 향상 | 개발자가 쿼리 성능을 스스로 점검하고 최적화하도록 유도합니다. |

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 = 1 | Slow Query 로그 기능 활성화 |
slow_query_log_file | 로그 파일 저장 경로 지정 |
long_query_time = 2 | 2초 이상 걸리는 쿼리를 기록 (단위: 초) |
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 로그는 일반 텍스트 파일로 저장되지만,
전문 도구를 활용하면 훨씬 효율적으로 분석할 수 있습니다.
| 도구명 | 특징 |
|---|---|
| mysqldumpslow | MySQL 기본 내장 도구, 로그를 요약 및 정렬하여 표시 |
| pt-query-digest | Percona Toolkit 도구, 실행 빈도·시간·쿼리 통계 등을 시각적으로 분석 |
| MySQL Enterprise Monitor | MySQL 공식 유료 모니터링 툴, 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 절 추가

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. 분석 도구를 쓰면 좋은 점은?
→ 사람이 직접 보기 어려운 패턴, 빈도, 실행 시간 통계를 자동으로 시각화해줍니다.