기타

슬로우쿼리(slowquery)

닥치고개돌 2019. 11. 28. 23:21
728x90

* slow query 란 ? DBMS 가 client로부터 요청받은 query를 수행할때 일정시간 이상 수행되지 못한 query

 

즉 길어야 1~2초 걸리는 db 쿼리가 예상보다 오래걸리는 경우를 뜻함.

 

저번주 잘못 된 쿼리덕에 전자결재 서버가 마비되는 상황 발생.

 

원인은 where절에 null값이 들어가 풀스캔 쿼리로 인해...

 

해결은 컨트롤러의 if문 한줄 추가로 간단하게 해결함.

 

언제든 값이 정상적이지 않을거라는 예외상황을 염두해둬야함

 

로그잘 쌓고 잘 확인하자

 

* 로그쌓는법

 

슬로우쿼리는 my.cnf 파일 내에서 설정.

my.cnf의 경로는 주로 /etc/my.cnf를 사용합니다. 편집기를 통해 다음의 내용을 입력한다.

my.cnf로 수정할 경우 mysql 서비스 재시작이 필요함.

 

 

항목

my.cnf 추가 내용

 해당 값(초) 이상의 로그 기록

 long_query_time = 3 

 슬로우쿼리 활성 여부 (0 = 비활성 / 1 = 활성)

 slow_query_log = 1

 슬로우쿼리 로그파일 경로

 slow_query_log_file = /var/log/mysql/slow_queries.log 

 index를 사용하지 않는 쿼리 기록 여부

 log_queries_not_using_indexes = on 

 

 

또는 mysql 내에서 아래와 같은 명령어를 통해 서비스 재시작을 하지 않고 적용도 가능.

항목

mysql 실행 명령어 

 해당 값(초) 이상의 로그 기록

 mysql> set global long_query_time = 3;

 슬로우쿼리 활성 여부 (0 = 비활성 / 1 = 활성)

 mysql> set global slow_query_log = 1;

 슬로우쿼리 로그파일 경로

 mysql> set global slow_query_log_file="/var/log/mysql/slow_queries.log

 index를 사용하지 않는 쿼리 기록 여부

 mysql> set global log_queries_not_using_indexes = on;

 

 

Time = 쿼리 요청 시각

Query_time : 쿼리 수행 시간

Lock_time : 락이 걸린 시간

Rows_sent = 쿼리 결과 row수

Rows_examined = 쿼리대상 row수 

 

 

PostgreSQL

 

슬로우쿼리를 잡아내는 3가지 방법

 

1. 슬로우 쿼리가 발생하면 로그 남기기

2. 쿼리 실행계획 로그에 남기기

3. 쿼리 실행 통계 보기

 

1. 슬로우 쿼리가 발생하면 로그 남기기

어느정도 느려지면, 쿼리 실행문을 로그에 남길건지 postgresql.conf에 설정값을 추가해줘야한다.

conf파일 수정

> vi postgresql.conf

log_min_duration_statement = 5000

 

그리고 config를 reload 해주면 된다.

postgres=# SELECT pg_reload_conf();

 pg_reload_conf

----------------

 t

(1 row)

 

728x90