MySQL 느린 쿼리 로그 설정과 분석 (slow query log, mysqldumpslow)
사이트가 느려졌는데 어떤 SQL이 범인인지 모르겠다면, 추측하기 전에 느린 쿼리부터 기록해 보자. MySQL 느린 쿼리 로그 기능은 정해진 시간보다 오래 걸린 SQL을 파일로 남겨 준다. 이 글에서는 로그를 켜는 방법, 결과를 읽는 방법, 요약 도구 mysqldumpslow 사용법까지 정리한다. 찾아낸 쿼리를 분석하는 방법은 SQL 실행 계획(EXPLAIN) 보는 방법에 있다.

MySQL 느린 쿼리 로그 설정 항목
| 변수 | 뜻 | 예 |
|---|---|---|
slow_query_log | 켜기/끄기 | ON |
long_query_time | 이 시간(초)보다 오래 걸리면 기록 | 1 |
slow_query_log_file | 로그 파일 위치 | /var/log/mysql/mysql-slow.log |
log_queries_not_using_indexes | 인덱스를 안 쓰는 쿼리도 기록 | OFF(필요할 때만) |
MySQL 느린 쿼리 로그 켜기
재시작 없이 바로 켜기
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
SET GLOBAL slow_query_log_file = '/var/log/mysql/mysql-slow.log';
SHOW VARIABLES LIKE 'slow_query%';
SHOW VARIABLES LIKE 'long_query_time';SET GLOBAL로 바꾼 long_query_time은 새로 접속한 세션부터 적용된다. 또 MySQL을 재시작하면 원래대로 돌아간다.
설정 파일로 계속 유지하기
# /etc/mysql/mysql.conf.d/mysqld.cnf (Ubuntu) 또는 /etc/my.cnf
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 1
sudo systemctl restart mysql로그 파일이 들어갈 디렉터리는 mysql 사용자가 쓸 수 있어야 한다. MySQL 기본 설정은 MySQL 설치 후 꼭 필요한 설정에 정리했다.
느린 쿼리 로그 읽는 법
# Time: 2026-10-15T01:23:45.678901Z
# User@Host: wp[wp] @ localhost []
# Query_time: 3.214567 Lock_time: 0.000123 Rows_sent: 20 Rows_examined: 1248370
SET timestamp=1760491425;
SELECT * FROM wp_posts WHERE post_content LIKE '%검색어%' ORDER BY post_date DESC LIMIT 20;- Query_time: 실제 걸린 시간(초)
- Lock_time: 잠금을 기다린 시간
- Rows_sent: 돌려준 행 수
- Rows_examined: 읽어 본 행 수. Rows_sent에 비해 훨씬 크면 인덱스를 못 쓰고 있을 가능성이 높다
위 예는 20줄을 돌려주려고 124만 줄을 읽었다. 앞에 %가 붙은 LIKE 검색은 일반 인덱스를 쓰지 못하는 대표적인 경우다.
MySQL 느린 쿼리 로그 요약: mysqldumpslow
로그가 쌓이면 같은 모양의 쿼리를 묶어서 보는 것이 효율적이다. MySQL에 함께 설치되는 mysqldumpslow를 쓰면 된다.
# 총 소요 시간 기준 상위 10개
sudo mysqldumpslow -s t -t 10 /var/log/mysql/mysql-slow.log
# 실행 횟수 기준 상위 10개
sudo mysqldumpslow -s c -t 10 /var/log/mysql/mysql-slow.log숫자와 문자열 값은 N, ‘S’로 바꿔서 묶어 주기 때문에, 조건값만 다른 같은 쿼리를 한 번에 볼 수 있다. 더 자세한 분석이 필요하면 Percona Toolkit의 pt-query-digest를 쓰기도 한다.
찾은 다음에 할 일
- EXPLAIN으로 실행 계획을 확인한다(EXPLAIN 보는 법).
- WHERE와 ORDER BY에 쓰인 컬럼에 맞는 인덱스를 검토한다(MySQL 인덱스 설계 원칙).
- 필요 없는 SELECT * 대신 필요한 컬럼만 가져온다.
- 수정 후 같은 쿼리의 Query_time과 Rows_examined가 줄었는지 다시 확인한다.
운영 서버에서 주의할 점
- long_query_time을 0으로 두면 모든 쿼리가 기록되어 디스크가 빠르게 찬다. 분석할 때만 잠깐 낮춘다.
- 로그 파일도 logrotate로 관리한다(logrotate 사용법).
- log_queries_not_using_indexes는 작은 테이블 쿼리까지 잡혀 로그가 많아지니 필요할 때만 켠다.
설정 항목 전체는 MySQL 공식 slow query log 문서에 있다.
MySQL 느린 쿼리 로그 정리
느린 사이트를 고칠 때 가장 먼저 할 일은 측정이다. 느린 쿼리 로그를 켜고 하루 정도 쌓은 뒤, mysqldumpslow로 상위 몇 개만 골라 EXPLAIN과 인덱스로 손보면 대부분의 체감 속도 문제는 해결된다. 서버 쪽 포트 문제는 전날 글인 포트 사용 중 오류 해결에서 다뤘다.
첫 댓글을 남겨보세요