MySQL에서 슬로우 쿼리 로그를 제대로 활용하기 위해서는 단순히 기능을 켜는 것만으로는 부족하다.
slow_query_log 관련 설정 옵션을 얼마나 세밀하게 조정하느냐에 따라 로그의 품질과 분석 효율이 완전히 달라진다.
이 글에서는 slow_query_log, long_query_time, log_queries_not_using_indexes, min_examined_row_limit 등 주요 설정 항목들을 하나하나 상세히 설명하고 실전 예제까지 함께 소개한다.

🧠 slow_query_log = ON
이 옵션은 슬로우 쿼리 로그 기능 자체를 켜거나 끄는 스위치 역할을 한다.
기본값은 OFF이며, 켜야 로그가 기록되기 시작한다.
SET GLOBAL slow_query_log = 1;
# my.cnf 또는 my.ini 설정 예시
slow_query_log = 1
활성화된 후에는 long_query_time 기준에 따라 쿼리가 기록된다.
⏱️ long_query_time
이 옵션은 슬로우 쿼리로 판단되는 최소 실행 시간(초 단위)을 설정한다.
예를 들어 long_query_time = 2는 2초 이상 걸린 쿼리만 로그에 기록한다는 의미다.
SET GLOBAL long_query_time = 2;
long_query_time = 2
이 값을 너무 낮게 설정하면 로그가 너무 많이 쌓여 오히려 관리가 어려워질 수 있다.
개발 환경에서는 long_query_time = 0으로 모든 쿼리를 기록해 디버깅 용도로 활용할 수 있다.
SET GLOBAL long_query_time = 0;
주의할 점은 소수점 단위도 가능하다는 것이다.
아래처럼 밀리초 수준으로 기록 기준을 좁힐 수도 있다.
SET GLOBAL long_query_time = 0.1;
🔎 log_queries_not_using_indexes
이 옵션은 인덱스를 전혀 사용하지 않은 쿼리를 로그에 남길지 여부를 설정한다.
설정하면 long_query_time을 만족하지 않더라도 인덱스를 전혀 쓰지 않은 쿼리는 로그에 기록된다.
실제 운영 환경에서 가장 유용하게 사용되는 옵션 중 하나다.
SET GLOBAL log_queries_not_using_indexes = 1;
log_queries_not_using_indexes = 1
예를 들어 다음 쿼리는 실행시간이 짧더라도 인덱스가 없으면 로그에 기록된다.
SELECT * FROM users WHERE name LIKE '%김%';
→ 와일드카드 앞에 %가 있으면 인덱스를 못 쓴다.
이 옵션을 활용하면 인덱스 최적화 대상 쿼리를 빠르게 추려낼 수 있다.
📉 min_examined_row_limit
이 옵션은 슬로우 쿼리로 간주하기 위한 최소 rows 스캔 수를 설정한다.
즉, 실행 시간이 길어도 rows를 거의 조회하지 않았다면 로그에 남기지 않도록 필터링하는 기능이다.
SET GLOBAL min_examined_row_limit = 100;
min_examined_row_limit = 100
예를 들어 다음처럼 설정하면 rows를 100개 이상 검색한 쿼리만 로그에 기록된다.
너무 작은 쿼리까지 로그에 찍히는 걸 방지하는 데 유용하다.
실무에서는 다음 조합이 자주 쓰인다
SET GLOBAL slow_query_log = 1;
SET GLOBAL long_query_time = 1;
SET GLOBAL log_queries_not_using_indexes = 1;
SET GLOBAL min_examined_row_limit = 100;
이렇게 설정하면 1초 이상이거나 인덱스를 사용하지 않고 100개 이상을 스캔한 쿼리만 로그에 남게 된다.
과도한 로그 생성을 줄이면서도 핵심적인 병목 쿼리를 효과적으로 추출할 수 있는 조합이다.
🛠️ 실무에서 자주 사용하는 설정 조합 예시
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 1
log_queries_not_using_indexes = 1
min_examined_row_limit = 50
이 설정은 실시간 트래픽이 많은 시스템에서 가장 보편적이고 안전한 설정값 조합이다.
운영 중이라면 로그 파일이 과도하게 커지지 않도록 logrotate 설정도 병행해야 한다.
🧪 실습: 설정 변경 후 확인 방법
MySQL 접속 후 다음 명령어로 현재 설정 상태를 확인할 수 있다.
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'long_query_time';
SHOW VARIABLES LIKE 'log_queries_not_using_indexes';
SHOW VARIABLES LIKE 'min_examined_row_limit';
결과 예시
slow_query_log: ON
long_query_time: 1.000000
log_queries_not_using_indexes: ON
min_examined_row_limit: 50
설정이 정상적으로 반영되었는지 꼭 확인해야 한다
SET GLOBAL로 설정한 값은 MySQL 재시작 시 사라지므로, 영구 적용하려면 반드시 my.cnf에 반영해야 한다.
✅ 정리
- slow_query_log는 로그 활성화 여부를 결정
- long_query_time은 느린 쿼리 기준 실행 시간을 초 단위로 설정
- log_queries_not_using_indexes는 인덱스를 사용하지 않은 쿼리도 기록
- min_examined_row_limit은 일정 rows 이상 검색한 쿼리만 로그에 남김
- 실무에서는 이 4가지 옵션을 조합하여 최적의 로그 필터링을 구성
슬로우 쿼리 로그는 단순한 기능이지만 이 옵션들을 어떻게 활용하느냐에 따라 성능 개선의 효율성이 완전히 달라진다.
🔗 공식 문서 참고
MySQL 8.0 Reference Manual - Slow Query Log Options
'DB' 카테고리의 다른 글
| [MySQL] 서브쿼리 vs JOIN vs CTE 기본 개념 비교 총정리 (2) | 2025.07.08 |
|---|---|
| [MySQL] 슬로우 쿼리 실전 튜닝 사례로 배우는 병목 원인 분석 (1) | 2025.07.07 |
| [MySQL] mysqldumpslow, pt-query-digest로 슬로우 쿼리 분석하기 🔧 (4) | 2025.07.04 |
| [MySQL] 슬로우 쿼리 로그 파일 위치와 확인 방법 🗂️ (0) | 2025.07.04 |
| [MySQL] 슬로우 쿼리 로그 설정 방법 (my.cnf + RDS 포함) (1) | 2025.07.04 |
| [MySQL] 슬로우 쿼리 로그란? 원리와 기본 개념 총정리 (0) | 2025.07.04 |
| [MySQL] 실행계획 캐시와 쿼리 플랜 재사용 이해하기 🚀 (1) | 2025.07.04 |
| [MySQL] 서브쿼리 vs JOIN 성능 비교와 실행계획으로 분석하기 (1) | 2025.07.04 |