MySQL에서 쿼리 성능을 분석하고, 느린 쿼리를 찾아내기 위한 핵심 기능이 바로 슬로우 쿼리 로그(slow query log)이다. 실무에서 데이터베이스 속도가 느려질 경우, 가장 먼저 확인하는 항목 중 하나로 DB 병목 현상 분석의 출발점이라 할 수 있다.
트래픽이 많은 웹 서비스나 대용량 데이터를 다루는 프로젝트에서는 쿼리 튜닝과 인덱스 최적화가 필수이며, 이 모든 작업은 슬로우 쿼리 로그를 기반으로 시작된다.

🧠 슬로우 쿼리 로그란?
슬로우 쿼리 로그(slow query log)는 MySQL 서버에서 일정 시간 이상 소요된 쿼리를 자동으로 기록하는 기능이다. 주로 SELECT 쿼리에 적용되며, long_query_time으로 설정한 시간(기본값 10초)보다 오래 걸린 쿼리는 로그에 남는다.
이 기능은 단순한 로깅 수단이 아닌, 성능 병목 원인을 찾아내는 진단 도구로 활용된다.
🧩 슬로우 쿼리 로그를 사용하기 위한 초기 설정
슬로우 쿼리 로그는 MySQL이 설치되어 있어도 기본적으로 비활성화되어 있다. 따라서 사용 전에 설정을 활성화하고 몇 가지 파라미터를 지정해줘야 한다.
✅ 1. 어디서 설정할까?
슬로우 쿼리 로그 설정은 두 가지 방식이 있다.
- my.cnf (또는 my.ini) 파일에 설정 → MySQL 서버 재시작 필요
- SET GLOBAL 명령어로 실시간 설정 → 일시적, 재시작 시 사라짐
✅ 2. 실시간 설정 예제 (명령어 실행 위치)
MySQL 클라이언트 접속 후 아래 명령어를 입력하면 바로 활성화 가능하다.
-- 슬로우 쿼리 로그 활성화
SET GLOBAL slow_query_log = 'ON';
-- 로그 파일 위치 (기본값 확인 후 변경 가능)
SHOW VARIABLES LIKE 'slow_query_log_file';
-- 기준 시간 설정 (2초 이상 걸린 쿼리만 기록)
SET GLOBAL long_query_time = 2;
-- 인덱스를 사용하지 않은 쿼리도 기록하도록 설정 (선택)
SET GLOBAL log_queries_not_using_indexes = 'ON';
✅ 3. my.cnf에 영구 설정 (리눅스 서버 기준)
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
log_queries_not_using_indexes = 1
설정 후 MySQL 서비스를 재시작한다.
sudo systemctl restart mysql
✅ 4. 로그 파일 위치 확인
SHOW VARIABLES LIKE 'slow_query_log_file';
보통 Linux에서는 /var/log/mysql/mysql-slow.log, Windows에서는 C:\ProgramData\MySQL\MySQL Server X.X\ 경로에 생성된다.
이 위치는 my.cnf에서 직접 지정할 수도 있다.
🔎 슬로우 쿼리 로그에 기록되는 정보
슬로우 쿼리 로그에는 다음과 같은 유용한 정보들이 기록된다
- 쿼리 실행 시각
- 사용자와 클라이언트 IP 정보
- 실제 수행된 SQL 쿼리
- 실행 시간 (Query_time)
- 잠금 대기 시간 (Lock_time)
- 스캔한 row 수 (Rows_examined)
- 반환된 row 수 (Rows_sent)
예시 로그:
# Time: 2025-07-04T10:23:45.123456Z
# User@Host: user1[user1] @ localhost [127.0.0.1]
# Query_time: 4.102 Lock_time: 0.000 Rows_sent: 10 Rows_examined: 120000
SET timestamp=1720000000;
SELECT * FROM orders WHERE customer_id LIKE '%123%';
위 로그는 Query_time: 4.102로 4초 이상 걸렸고, 12만 건을 검색해 겨우 10건을 반환한 심각한 인덱스 누락 상황이다.
🛠 실무 예시: 느린 쿼리 튜닝 전/후 비교
-- BEFORE
SELECT * FROM products WHERE name LIKE '%apple%';
Query_time: 3.784 Rows_examined: 95000
→ %로 시작하는 와일드카드 때문에 인덱스 미사용
-- AFTER (Fulltext Index 활용 or 적절한 전처리)
SELECT * FROM products WHERE MATCH(name) AGAINST('apple');
Query_time: 0.087 Rows_examined: 142
→ 실행 시간이 약 40배 개선됨
📊 슬로우 쿼리 로그로 할 수 있는 일들
- 느린 쿼리 목록을 주기적으로 분석해 성능 병목 제거
- pt-query-digest, mysqldumpslow 같은 분석 도구와 연계
- EXPLAIN과 함께 사용해 실행 계획 시각화
- 다중 사용자 접속 시 시스템 부하 지점을 탐색
- 쿼리 성능을 수치화해 리팩토링 우선순위 정리
✅ 정리
- 슬로우 쿼리 로그는 MySQL 서버 성능을 분석하는 핵심 도구이다
- 기본적으로 꺼져 있으므로 설정 후 사용해야 하며, CLI 또는 my.cnf를 통해 활성화 가능하다
- 기록된 로그를 통해 인덱스 누락, 정렬 이슈, 풀 스캔 등을 탐지할 수 있다
- 실제 로그 분석을 통해 쿼리 성능이 수십 배 개선될 수 있으며, 실무에서는 필수적으로 관리해야 하는 항목이다
🔗 공식 문서 참고
MySQL 8.0 Reference Manual - The Slow Query Log
'DB' 카테고리의 다른 글
| [MySQL] mysqldumpslow, pt-query-digest로 슬로우 쿼리 분석하기 🔧 (4) | 2025.07.04 |
|---|---|
| [MySQL] 슬로우 쿼리 로그 파일 위치와 확인 방법 🗂️ (0) | 2025.07.04 |
| [MySQL] slow_query_log 주요 설정 옵션 설명 (long_query_time 등) ⚙️ (0) | 2025.07.04 |
| [MySQL] 슬로우 쿼리 로그 설정 방법 (my.cnf + RDS 포함) (1) | 2025.07.04 |
| [MySQL] 실행계획 캐시와 쿼리 플랜 재사용 이해하기 🚀 (1) | 2025.07.04 |
| [MySQL] 서브쿼리 vs JOIN 성능 비교와 실행계획으로 분석하기 (1) | 2025.07.04 |
| [MySQL] JOIN이 느릴 때 실행계획으로 튜닝하는 방법 (0) | 2025.07.04 |
| [MySQL] 실무 예제로 배우는 느린 쿼리 튜닝 실습 (EXPLAIN + INDEX 활용) (0) | 2025.07.04 |