mysql 에서도 I/O 연산을 줄이기 위한 Buffer Pool을 이용해 속도차이를 개선했다는 것이 신기하다.
Redis 도 in-memory 기반의 cache 서버로 DB 부하를 줄일다는 것이 기억났다.
기술발전에 따라 다양한 방법으로 속도 개선이 이루어지는 것을 알 수 있다.
또한 생각해볼 점은 Buffer Pool 이 메모리를 사용한다는 점이다.
만약 Buffer Pool보다 큰 작업을 수행하게 되면 이점없이 I/O 작업이 늘어나게 될 것이다.
Buffer Pool 사이즈를 변경하거나, 쿼리문, index 또는 unique 작업 등을 수정해봐야 겠다는 생각이 들었다.
MySQL
- 크게 MySQL 엔진과 Storage 엔진으로 구분
MySQL 엔진
- 요청 쿼리에 대해 어떻게 실행할지 결정하는 역할
InnoDB
특징
- 버퍼풀, 데드락 감지, MVCC, 클러스터링 인덱스, 등등 기능 지원
- 버퍼풀과 MVCC에 대해 알아보고자 한다.
버퍼풀
- MySQL엔진에서 사용하는 메모리 영역
- 쓰기 작업 최적화
- 요청 데이터가 버퍼풀에 있다면 바로 I/O 작업하지 않고 모았다가 실행한다.
- 물론 예외도 존재한다.
- 테이블과 인덱스 데이터를 캐싱
- 디스크 저장단위인 page 단위로 데이터 관리
- index는 공간 지역성 이점
- 인덱스나 데이터가 클러스터형 인덱스를 통해 정렬된 상태로 page에 저장
- 따라서 물리적으로 인접한 페이지에 있는 데이터도 논리적으로 연속된 데이터일 가능성이 높음
- 예를 들어, 테이블의 기본 키로 정렬된 행이 저장된 페이지가 메모리에 로드되면, 해당 페이지에서 바로 인접한 데이터를 읽는 연산도 버퍼풀 이용
- LRU 알고리즘으로 데이터를 관리
- 제일 많이 사용하지 않은 데이터를 탈락. (시간 지역성 관리)
- new sub set과 old sub set으로 나뉘어 관리
MVCC (Multi-Version Concurrency Version)
- 원본 데이터를 여러 version으로 관리하여 동시성 처리
- 대량 요청에 따른 성능 감소 방지
1) 현재 버퍼풀 상태
2) 두 Transaction A, B가 동시에 수행되는 상황
- transaction A: 음식 이름을 ‘파스타’에서 ‘라면’으로 변경
- 버퍼 풀은 변경된 데이터 저장
- 언두 로그는 변경 전 데이터 저장
- transaction A가 commit 전, 다음 isolation의 transaction B 가 수행된다면?
- 만약 tx B가 read_uncommited 격리수준 일때, ‘파스타’이름으로 조회하면?
- 버퍼풀 데이터를 조회하여 아무값도 조회 불가
- 만약 tx B가 read_commited / repeatable_read 격리수준 일때, ‘파스타’ 이름을 조회하면?
- 언두 로그를 조회하여 데이터 조회 가능
- 만약 tx B가 read_uncommited 격리수준 일때, ‘파스타’이름으로 조회하면?
'CS > DB' 카테고리의 다른 글
MySQL) 타입 DateTime 과 Timestamp 중 어떤걸 쓸까 (0) | 2023.09.28 |
---|---|
MySQL auto_increment와 innodb_autoinc_lock_mode (0) | 2023.06.12 |
mysql INFORMATION_SCHEMA 업데이트 속도 (0) | 2023.06.10 |
like 절 주의할 점 (0) | 2022.07.22 |
맥 mysql 설치 및 실행 (0) | 2022.07.22 |