본문 바로가기

MySQL & MariaDB

MySQL System Architecture - 2. Memory

MySQL System Architecture - 2. Memory

 

Overall

MySQL 서버에서 사용하는 메모리 구조는 크게 2가지로 분류할 수 있다.

 

1.글로벌 메모리 영역(Shaerd Memory)

- MySQL 내 모든 쓰레드들이 사용하는 공유 메모리 영역

- MySQL 서버가 시작될때 OS에 의해 할당 되며, 설정 변경 시 재기동이 필요

2.세션 메모리 영역(Local Memory)

- Foreground Thread 마다 할당되는 메모리  

- 쓰레드 마다 할당되는 메모리로 커넥션 갯수와 연계하여 설정필요

- Query를 수행하는 시점에서 할당됐다고 해제되는 메모리 영역이 존재

 

 

글로벌 메모리 영역

 

Buffer Pool

- 각 세션들이 사용할 데이터들을 디스크에서 가져와 저장하는 영역

- Data, Index, Lock ,Ditionary를 보관

- PostgreSQL에서의 Shared Buffer의 역할 ( 오라클은 Buffer Cache)

- 통상 물리메모리의 50%를 할당

 

Change buffer

- DML 작업시 사용되는 메모리 영역

- 기존에는 Insert 내역만 기록하여서 Insert Buffer로도 불림(5.5 버전이하)

- PK 이외의 다른 인덱스 들의 레코드 값을 보관하는 장소로, 인덱스에 대한 작업 성능 향상을  목적으로 함

- Buffer Pool에 해당 데이터가 존재 하지 않으며, 인덱스 변경 시 많은 리소스를 포함하므로 해당 영역을 통해 개선

 

Log buffers

- ACID(그중 A,D)를 보장하기 위한 Write ahed loging을 위한 영역으로 트랜잭션에 대한 변경 내역을 캐싱하는 메모리 영역

- Log Thread에 의해 디스크로 flush 되며 해당 WAL 파일은 복구 목적/으로 사용됨

 

- fsync와 같은 옵션이 항상 수행되므로 부하를 많이 가질 수 있음

 

Table Cache

- 테이블을 읽고 쓰는데 부하를 감소시키기 위해 오픈된 테이블의 정보를 캐싱하는 메모리 영역

- MySQL에서 테이블을 읽고 쓰기 위해서는 테이블을 열어야 한다하고 한다. 해당 작업은 부하를 가지고 있어 캐시를 통해 관리

- Table_open_cache 파라미터를 통해 조절이 가능함

 

세션 메모리 영역

Sort Buffer

- MySQL에서 인덱스를 이용한 정렬이 불가 할 경우, 정렬이 필요할 경우 할당되어 사용되는 메모리 영역

- PostgreSQL에서 work_mem 역할

- 정렬이 수행되고 쿼리 수행이 완료되면 바로 시스템에 반환됨

 

Join Buffer

- MySQL 특성상 NL, Hash Join을 수행하는데 Driven 조인컬럼에 적절한 인덱스가 존재 하지 않아 Join이 수행될 경우 사용되는 메모리 영역

- PostgreSQL에서 work_mem 역할

- 여러개의 테이블을 Join 할 경우 여러개의 Join Buffer가 할당 될 수 있으며 쿼리 수행이 완료되면 시스템이 반환됨

 

Connection Buffer

- Thread 가 생성될 때 마다 생성되는 메모리 영역

 

Binlog Cache

- Binary log를 디스크에 바로 쓰지 않고 특정 방식으로 분류된 변경사항을 캐싱하는 메모리 영역 

- Replication 구성 또는 시점 복구를 위해 사용되는 로그를 Binlog 라고로 하며 DB 변경사항을 바이너리 방식으로 기록

- Binary Log 포맷은 Statement , Row, Mixed 방식으로 지정할 수 있음

 

 

 

(그림 출처 및 참고 자료)

https://blog.ex-em.com/1682?category=1010730

Real MySQL 8.0내 있는 그림자료