DB

[MySQL] 슬로우 쿼리 로그란? 원리와 기본 개념 총정리

인생아 2025. 7. 4. 16:36
반응형

MySQL에서 쿼리 성능을 분석하고, 느린 쿼리를 찾아내기 위한 핵심 기능이 바로 슬로우 쿼리 로그(slow query log)이다. 실무에서 데이터베이스 속도가 느려질 경우, 가장 먼저 확인하는 항목 중 하나로 DB 병목 현상 분석의 출발점이라 할 수 있다.

트래픽이 많은 웹 서비스나 대용량 데이터를 다루는 프로젝트에서는 쿼리 튜닝과 인덱스 최적화가 필수이며, 이 모든 작업은 슬로우 쿼리 로그를 기반으로 시작된다.

🧠 슬로우 쿼리 로그란?

슬로우 쿼리 로그(slow query log)는 MySQL 서버에서 일정 시간 이상 소요된 쿼리를 자동으로 기록하는 기능이다. 주로 SELECT 쿼리에 적용되며, long_query_time으로 설정한 시간(기본값 10초)보다 오래 걸린 쿼리는 로그에 남는다.

이 기능은 단순한 로깅 수단이 아닌, 성능 병목 원인을 찾아내는 진단 도구로 활용된다.

반응형

🧩 슬로우 쿼리 로그를 사용하기 위한 초기 설정

슬로우 쿼리 로그는 MySQL이 설치되어 있어도 기본적으로 비활성화되어 있다. 따라서 사용 전에 설정을 활성화하고 몇 가지 파라미터를 지정해줘야 한다.

✅ 1. 어디서 설정할까?

슬로우 쿼리 로그 설정은 두 가지 방식이 있다.

  1. my.cnf (또는 my.ini) 파일에 설정 → MySQL 서버 재시작 필요
  2. 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

 

반응형