1. 배경 및 목표
오래 걸리는 쿼리를 추적하고 index 추가 등을 통해 성능을 개선해보는 경험을 해보고 싶었습니다.
제가 사용하는 mariaDB와 MySQL에는 slow query log라는 기능이 있다는 것을 알게 되었고 이를 적용하고자 했습니다.
2. 개념
Slow Query Log는 DB에서 실행 시간이 오래 걸린 SQL 쿼리를 기록하는 기능 입니다.
모든 쿼리를 기록하는 것이 아니라, 미리 정해둔 시간(threshold)을 초과한 쿼리만 로그로 남깁니다.
서비스에서 성능 문제가 발생하면 애플리케이션 로그나 모니터링을 통해서는 어떤 SQL이 병목인지 알기 쉽지 않습니다.
Slow Query Log를 사용하면 DB 관점에서 직관적인 답을 받을 수 있습니다.
주요 설정 요소는 다음과 같습니다.
- log_slow_query: 기능 ON/OFF (1: ON, 0:OFF)
- log_slow_query_time: 느리다고 판단할 기준 시간(threshold)
- log_output: 저장 방식(File/Table/None)
log_slow_query_time을 1로 설정하면 1초를 초과하는 쿼리만 기록하게 됩니다.
log_output을 Table로 하면 mysql.slow_log라는 테이블이 생성됩니다.
해당 테이블을 구성하는 칼럼들을 간단하게 알아보겠습니다.

3. 구현
개념을 간단하게 알아보았으니 직접 설정해보겠습니다.
저는 Amazon RDS의 MariaDB를 사용하고 있습니다.
1) 주요 설정
먼저 파라미터 그룹이 있어야 합니다.
RDS -> DB 인스턴스 -> 구성으로 들어가면 현재 설정된 파라미트 그룹을 확인할 수 있습니다.

저는 timezone이라는 이름으로 이전 개발자가 설정한 파라미터 그룹이 있었습니다.
이제 저 파라미터 그룹으로 들어갑니다.

파라미터 그룹에서 주요 설정 지표들을 확인할 수 있습니다.
편집을 누르면 다음과 같은 화면을 확인 가능합니다.


앞서 설명한 log_slow_query, log_slow_query_time, log_output을 확인 가능합니다.
저는 기준시간 1초, log_output은 table로 설정하였습니다.
값을 변경한 후 변경 사항 저장을 눌러줍니다.
2) 설정 확인
저는 MYSQL의 Workbench를 주로 사용하기 때문에 workbench 환경에서 설정이 제대로 됐나 확인해보겠습니다.
다음 쿼리들을 실행해보겠습니다.
SHOW VARIABLES LIKE 'log_slow_query';
SHOW VARIABLES LIKE 'log_slow_query_time';
SHOW VARIABLES LIKE 'log_output';



값이 제대로 설정한 것을 볼 수 있습니다.
새로 생긴 mysql.slow_log 테이블의 구조를 확인해보겠습니다.
DESCRIBE mysql.slow_log;

앞서 설명한 칼럼들을 확인할 수 있습니다.
이번에는 쿼리로 로그를 직접 넣어보겠습니다.
# 로그 삽입
SELECT SLEEP(1.2);
# 확인
SELECT * FROM mysql.slow_log;

값이 제대로 삽입된 것을 확인할 수 있었습니다.
정말 오랜만에 글을 작성하는 것 같습니다.
지금 많은 작업들을 병렬로 처리하다보니 포스팅이 많이 늦어지고 있습니다.
열심히 한것들 모두 나누고 기록하도록 좀 더 열심히 해보겠습니다.