2022. 5. 12. 13:26ㆍ데이터베이스
이 글은 'Real MySQL 8.0 개발자와 DBA를 위한 MySQL 실전 가이드'를 보고 학습한 내용을 정리한 글입니다.
책을 사고 보기 시작한 지 하루가 지났다. 생각보다 실무적이고 깊은 내용이 많아서 당장 적용할 것은 없지만, 나중에 어플리케이션 백엔드 개발자로 일할 때 쓸모가 아주 많은 레퍼런스인 것 같다. 마스터 호눅스와 모닝 스크럼을 하면서 해당 내용에 대해 이야기를 나눠봤는데, 주니어 레벨에서 공부하기에는 너무 어려운 책이라고(ㅠㅠ) 하셨다. 백과사전같은 책이라서 가볍게 보거나 초중급책을 더 보고온 후 나중에 필요한 부분만 떼어서 공부하는 방식이 더 좋을 것 같다고 조언받았다. 그래서 중요하다고 느끼는 부분을 조금씩 기록해 나갈 예정이다.
슬로우 쿼리 로그
MySQL 서버의 쿼리 튜닝은 크게
- 서비스가 적용되기 전 전체적으로 튜닝하는 경우
- 서비스 운영 중 MySQL 서버의 전체적인 성능 저하를 검사하거나 정기적인 점검을 위한 튜닝을 하는 경우
로 나눌 수 있다. 전자의 경우 검토 대상인 쿼리가 전체라서 모두 튜닝하면 되지만, 후자의 경우는 어떤 쿼리가 문제인지 판단하기가 상대적으로 매우 어렵다. 이것을 판단하는 데 도움을 주는 것이 슬로우 쿼리 로그다.
슬로우 쿼리 로그 파일에는 시스템 변수 long_query_time 시스템 변수에 설정한 시간 이상의 시간이 소요된 쿼리가 모두 기록에 남는다.
중요한 것은, 쿼리가 실제 정상적으로 실행이 완료되어야 로그에 남든 말든 할 수 있다.
즉, '일단 정상적으로 실행이 완료됐고 실행하는 데 걸린 시간이 long_query_time에 정의된 시간보다 많이 걸린 쿼리'를 의미한다.
log_output 옵션을 이용해 슬로우 쿼리를 로그 파일 혹은 테이블로 기록할지 선택 할 수 있다.
로그 :
# Time: 2022-05-12T13:01:55.178484+09:00
# User@Host: root[root] @ localhost [] Id: 14
# Query_time: 1.180245 Lock_time: 0.002658 Rows_sent: 1 Rows_examined: 2844047
use employees;
SET timestap=1595141060;
select emp_no, max(salary) from salaries;
- 'Time' 항목은 쿼리가 종료된 시점을 의미한다.
- 'User'@'Host'는 쿼리를 실행한 사용자의 계정이다 (MySQL에서는 'Host'까지도 계정으로 인식한다고 보면 된다)
- 'Query_time'은 쿼리가 실행되는데 걸린 전체 시간이다.
- 'Lock_time'은 MySQL 엔진 레벨에서의 테이블 잠금에 대한 대기 시간만 표현한다.(잠금 체크같은 코드실행시간 포함)
- 'Rows_examined'는 쿼리 처리동안 몇 건의 레코드에 접근했는지를 의미한다.
- 'Rows_sent'는 몇 건의 레코드가 클라이언트로 전송되었는지를 의미한다. ('examined'와 'sent'의 값 차이가 크면 튜닝가치가 있다)
그런데, 사람이 이 로그를 하나하나 보고 있기에는 현실적으로 불가능하다. 이 경우 외부 스크립트나 툴을 활용해서 DB 운영을 간편하고 빠르게 해보자! (Percona Toolkit -> pt-query-digest 스크립트)
'데이터베이스' 카테고리의 다른 글
InnoDB의 레코드락에 대한 궁금점 (1) | 2022.07.15 |
---|---|
MySQL8.0 Error Code: 1071. Specified key was too long 해결법 (1) | 2022.07.15 |
[MySQL8.0] B-Tree 인덱스 사용에 영향을 미치는 요소 (0) | 2022.06.17 |
ORDER BY rand() 쿼리문 튜닝하기! (0) | 2022.05.23 |
서비스로직과 트랜잭션 분리 [SPRING] (1) | 2022.05.12 |