mysql에서 실행되는 쿼리들중 오래 걸리는 쿼리를 확인하기 위해서 slow query 를 설정한다.
방법은
1. my.cnf 에 아래와 같이 입력하고, mysql을 재시작 해주거나
slow_query_log_file = /var/log/mysql-slow.log
long_query_time = 3
slow_query_log = 1
2. mysql 콘솔에서 set global 을 이용해 바로 변경하는 방법이다. 이때 set global은 서버가 재시작 되면 초기화 된다는점을 유념해야 한다.
mysql> set global long_query_time = 1;// 초단위 입력
mysql> set global slow_query_log = 'ON';// ON , OFF
이렇게 하면 느린 쿼리를 확인 할 수 있다.
그런데, 이렇게 했음에도 slow query에 설정된 값보다 작은 시간들의 쿼리 로그가 기록된다면,
예로 long_query_time = 1; 로 1초 이상 쿼리를 로그 기록 하도록 설정 했음에도 1초 미만의 쿼리들이 기록이 된다면,
설정에서 아래 내용들을 확인해 봐야 한다.
long_query_time이 1초로 설정되어 있는데도 1초 미만의 쿼리가 로그에 기록된다면, 다음을 확인해야 합니다.
- min_examined_row_limit 값: 이 값이 0으로 설정되어 있다면, 실행 시간이 짧더라도 모든 쿼리가 기록될 수 있습니다. 이 값을 적절한 값(예: 1000)으로 변경해야 합니다.
- log_queries_not_using_indexes: 이 설정이 ON으로 되어 있다면, long_query_time에 관계없이 인덱스를 사용하지 않는 쿼리는 모두 로그에 기록됩니다. 이 설정을 OFF로 변경하면 이로 인한 로그 기록을 막을 수 있습니다.
slow query 기록에 영향을 주는 설정값으로는
1. long_query_time : 쿼리 실행 시간
2. min_examined_row_limit : 쿼리 실행시 검사한 쿼리 행의 최소 수
3. og_queries_no_using_indexes : : 인덱스를 사용하지 않는 쿼리를 식별하는 설정값으로 'ON/OFF'
여기서 신경 써야 할 것(간과 하는 것)이
log_queries_no_using_indexes 인데, 이 설정이 'ON' 되어 있을 경우 long_query_time 과 무관히게 로그에 기록한다.
min_examined_row_limit 는 검사한 쿼리의 행 수를 제한 하는 설정으로 0이면 검색한 행의 값이 0개 이더라도, query time 이 1초를 넘으면 기록하게 되어 로그파일 사이즈 증간, 파일 I/O 부하등을 유발 할 수 있어 적당한 값을 설정하는 것을 권고 한다고 한다.