DB

[MySQL] slow_query_log 주요 설정 옵션 설명 (long_query_time 등) ⚙️

인생아 2025. 7. 4. 18:54
반응형

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

 

반응형