책너두 6기 14일차
백은빈, 이성욱의 Real MySQL8.0 1권 p.150 ~ p.159
내용정리
04 아키텍처
4.4.3 슬로우 쿼리 로그
MySQL 서버의 쿼리 튜닝은 서비스가 적용되기 전 튜닝과 운영 중 전체적인 성능 검사나 정기 점검 튜닝으로 나눌 수 있다. 슬로우 쿼리 로그 파일에는 설정한 시간 이상의 시간이 소요된 쿼리가 모두 기록된다. 실행 완료 후 기록으로 판단하기 때문에 실행이 정상적으로 완료되야만 기록될 수 있다.
-
Time
: 쿼리가 종료된 시점 User@Host
: 쿼리를 실행한 사용자의 계정Query_time
: 쿼리가 실행되는데 걸린 전체 시간.Time
에서 이것을 뺴면 시작 시간을 알 수 있다.Rows_examined
: 이 쿼리가 처리되기 위 해 몇 건의 레코드에 접근했는지
스크립트를 이용해 빈도나 처리 성능 별로 쿼리를 정렬해서 살펴볼 수 있다. Log 파일을 분석하면 다음이 나온다.
4.4.3.1 슬로우 쿼리 통계
최상단에 표시. 모둔 쿼리를 대상으로 실행 시간, 잠금 대기 시간 등 관련 표시
4.4.3.2 실행 빈도 및 누적 실행 시간순 랭킹
각 쿼리별로 응답 시간과 실행 횟수
4.4.3.3. 쿼리별 실행 횟수 및 누적 실행 시간 상세 정보
쿼리 랭킹에 표시된 순서대로 자세한 내용을 보여준다.
05 트랜잭션과 잠금
트랜잭션 : 작업의 완전성을 보장해 주는 것. 논리적인 작업 셋(set)을 완벽하게 처리하거나, 처리하지 못할 경우에는 원 상태로 복구해서 작업의 일부만 적용되는 형상(Partial update)이 발생하지 않게 만들어주는 기능.
잠금(Lock) : 동시성을 제어하기 위한 기능. 여러 커넥션에서 동시에 동일한 자원(레코드나 테이블)을 요청할 경우 순서대로 한 시점에는 하나의 커넥션만 변경할 수 있게 해주는 역할
5.1 트랜잭션
5.1.1 MySQL에서의 트랜잭션
트랜잭션은 하나의 논리적인 작업 셋에 몇개의 쿼리가 있뜬 관계없이 논리적인 작업 셋 자체가 100% 적용되거나 아무것도 적용되지 않아야 함을 보장해 주는 것이다.
5.1.2 주의사항
트랜잭션 또한 DBMS의 커넥션과 동일하게 꼭 필요한 최소의 코드에만 적용하는 것이 좋다. 프로그램 코드에서 트랜잭션의 범위를 최소화하라는 의미다.
다음 간소화된 과정을 통해 살펴보자
- 처리 시작
- 데이터베이스 커넥션 생성
- 트랜잭션 시작
- 사용자의 로그인 여부 확인
- 사용자의 글쓰기 내용의 오류 여부 확인
- 첨부로 업로드된 파일 확인 및 저장
- 사용자의 입력 내용을 DBMS에 저장
- 첨부 파일 정보를 DBMS에 저장
- 저장된 내용 또는 기타 정보를 DBMS에서 조회
- 게시물 등록에 대한 알림 메일 발송
- 알림 메일 발송 이력을 DBMS에 저장
- 트랜잭션 종료(COMMIT)
- 데이터베이스 커넥션 반납
- 처리 완료
- 보통 개발자들은 위의 순서로 처리하는데 실제로 DBMS에 데이터를 저장하는 작업(트랜잭션)은 5번부터 시작된다는 것을 알 수 있다. 그래서 2번, 3번, 4번의 절차가 아무리 빨리 처리된다고 하더라도 DBMS의 트랜잭션에 포함시킬 필요는 없다.
- 네트워크를 통해 원격 서버와 통신하는메일 전송이나 FTP 파일 전송 작업 등은 어떻게 해서든 DBMS의 트랜잭션 내에서 제거하는 것이 좋다. 프로그램 실행 중 서버와 통신할 수 없는 상황이 발생하면 DBMS 서버까지 위험해진다.
- 이 과정에는 DBMS의 작업이 크게 4개가 있다.
- 사용자의 입력 정보를 저장하는 5번, 6번 작업은 하나의 트랜잭션으로 묶어야 한다.
- 7번 작업은 저장된 데이터의 단순 확인 및 조회이므로 트랜잭션에 포함될 필요가 없다.
- 9번 작업은 성격이 조금 달라 5,6번 트랜잭션과 함께 묶지 않아도 좋다.
위 결론을 바탕으로 처리 절차를 재설계해보자.
- 처리 시작
- 사용자의 로그인 여부 확인
- 사용자의 글쓰기 내용의 오류 발생 여부 확인
- 첨부로 업로드된 파일 확인 및 저장
- 데이터베이스 커넥션 생성(또는 커넥션 풀에서 가져오기)
- 트랜잭션 시작
- 사용자의 입력 내용을 DBMS에 저장
- 첨부 파일 정보를 DBMS에 저장
- 트랜잭션 종료(COMMIT)
- 저장된 내용 또는 기타 정보를 DBMS에서 조회
- 게시물 등록에 대한 알림 메일 발송
- 트랜잭션 시작
- 알림 메일 발송 이력을 DBMS에 저장
- 트랜잭션 종료(COMMIT)
- 데이터베이스 커넥션 종료(또는 커넥션 풀에 반납)
- 처리 완료