메인 콘텐츠로 건너뛰기

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
슬로우 쿼리 로그는 주의가 필요한 쿼리를 찾기 위한 MySQL의 내장 도구입니다. 설정 가능한 임계값보다 오래 걸리는 모든 쿼리를 잡아내어 로그 파일에 기록합니다. 어떤 쿼리를 최적화해야 할지 모르겠다면 여기서 시작하세요.

슬로우 쿼리 로그 활성화하기

서버를 재시작하지 않고 런타임에 활성화할 수 있습니다:
이 설정은 즉시 적용되지만 서버 재시작 시 초기화됩니다. 영구적으로 만들려면 my.cnf나 my.ini에 추가하세요:

무엇이 기록되나

일반적인 항목은 다음과 같습니다:
가장 중요한 헤더 필드: Rows_examined / Rows_sent 비율이 핵심 신호입니다. MySQL이 1행을 돌려보내기 위해 847,293행을 검사했다면, 결과 하나를 찾으려고 테이블 거의 전체를 스캔하고 있는 것입니다. 그것이 인덱스가 필요한 쿼리입니다.

인덱스를 사용하지 않는 쿼리 기록하기

오버헤드가 더 낮은 변형: 실행 시간과 관계없이 인덱스를 전혀 사용하지 않는 쿼리만 기록합니다.
이것은 명백한 인덱스 누락 문제가 성능 문제가 되기 전에 잡아내는 데 유용합니다. 바쁜 서버에서는 많은 로그 항목을 만들 수 있으므로, log_throttle_queries_not_using_indexes와 함께 사용해 속도를 제한하세요:

mysqldumpslow로 로그 분석하기

바쁜 서버에서는 슬로우 쿼리 로그가 빠르게 커집니다. mysqldumpslow는 비슷한 쿼리를 집계하고 총 시간으로 순위를 매겨, 무엇을 먼저 고칠지 쉽게 찾게 해 줍니다:
출력은 리터럴 값을 N과 S로 바꾸어 쿼리를 구조별로 묶습니다:
이 쿼리는 523번 실행되었고, 평균 4.52초, 총 2,364초의 서버 시간을 썼습니다. 거기서 시작하세요.

슬로우 쿼리를 EXPLAIN으로 넘기기

비용이 큰 쿼리를 찾았다면 EXPLAIN을 실행해 실행 계획을 확인하세요:
type: ALL(전체 테이블 스캔)과 Extra: Using filesort를 찾으세요. 둘 다 인덱스로 고칠 수 있습니다 — MySQL 인덱스의 동작 방식과 MySQL에서 EXPLAIN 읽기를 참조하세요.

자주 묻는 질문

long_query_time을 얼마로 설정해야 하나요?

1초에서 시작하세요. 최악의 쿼리를 해결한 뒤에는 중간 심각도의 문제를 잡기 위해 0.1로 낮추세요. 성능이 중요한 애플리케이션에서는 0.05 이하가 흔합니다. 0으로 설정하면 모든 쿼리를 기록합니다 — 특정 작업을 프로파일링하는 데 유용하지만, 프로덕션 모니터링용은 아닙니다.

슬로우 쿼리 로그를 활성화하면 성능에 영향이 있나요?

아주 적습니다. 오버헤드는 기록되는 쿼리당 약간의 I/O입니다. long_query_time = 1인 바쁜 프로덕션 서버에서는 정말로 느린 쿼리만 기록되므로 — 일반적인 오버헤드는 무시할 만합니다. 모든 쿼리를 기록하는 것(long_query_time = 0)은 측정 가능한 오버헤드가 있으므로 일시적으로만 사용해야 합니다.

파일을 읽는 대신 SQL로 슬로우 로그를 쿼리할 수 있나요?

예, log_output = TABLE을 설정했다면 mysql.slow_log 테이블을 사용할 수 있습니다 — performance_schema에는 슬로우 로그 테이블이 없습니다:
프로덕션에서는 일반적으로 파일 출력이 선호됩니다 — 테이블 방식은 기록되는 모든 쿼리에 쓰기 오버헤드를 더합니다.

문제 해결

슬로우 쿼리 로그와 mysqldumpslow는 MySQL의 드롭인 대체품이자 확장 기능을 갖춘 VillageSQL에서 동일하게 동작합니다.

함께 보기