VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
슬로우 쿼리 로그 활성화하기
서버를 재시작하지 않고 런타임에 활성화할 수 있습니다:my.cnf나 my.ini에 추가하세요:
무엇이 기록되나
일반적인 항목은 다음과 같습니다:Rows_examined / Rows_sent 비율이 핵심 신호입니다. MySQL이 1행을 돌려보내기 위해 847,293행을 검사했다면, 결과 하나를 찾으려고 테이블 거의 전체를 스캔하고 있는 것입니다. 그것이 인덱스가 필요한 쿼리입니다.
인덱스를 사용하지 않는 쿼리 기록하기
오버헤드가 더 낮은 변형: 실행 시간과 관계없이 인덱스를 전혀 사용하지 않는 쿼리만 기록합니다.log_throttle_queries_not_using_indexes와 함께 사용해 속도를 제한하세요:
mysqldumpslow로 로그 분석하기
바쁜 서버에서는 슬로우 쿼리 로그가 빠르게 커집니다.mysqldumpslow는 비슷한 쿼리를 집계하고 총 시간으로 순위를 매겨, 무엇을 먼저 고칠지 쉽게 찾게 해 줍니다:
N과 S로 바꾸어 쿼리를 구조별로 묶습니다:
슬로우 쿼리를 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에서 동일하게 동작합니다.
함께 보기
- MySQL에서 EXPLAIN 읽기 — 찾아낸 느린 쿼리 분석하기
- MySQL 인덱스의 동작 방식 — 느린 쿼리의 가장 흔한 해결책
- MySQL 연결 풀링 — 슬로우 쿼리 로그가 잡지 못하는 또 다른 지연 원인
- 내 MySQL 쿼리는 왜 느린가요? — 로그가 드러낸 쿼리로 무엇을 할지
- ORM과 함께 MySQL 사용하기: Django, Rails, Prisma — ORM이 생성하는 것 잡아내기