# 메모리 할당 및 사용 구조

## 메모리 할당 및 사용 구조

<img src="https://wiki.luigi99.cloud/uploads/images/gallery/2026-01/RmzFklXV1jdeP8wy-image-1769486235900.png" width="70%">

- MySQL 메모리 공간은 **글로벌 메모리 영역**과 **로컬 메모리 영역**으로 구분할 수 있음
- **글로벌 메모리 영역**은 MySQL 서버가 시작되면서 **운영체제로부터 할당**받음
- 글로벌 메모리 영역과 로컬 메모리 영역은 **스레드가 공유해서 사용하는 공간인지 여부**에 따라 구분됨

---

## 글로벌 메모리 영역

- 일반적으로 클라이언트 **스레드의 수와 무관**하게 하나의 메모리 공간만 할당
  - 필요에 따라 2개 이상의 메모리 공간을 할당받을 수 있으나 클라이언트 스레드 수와 무관
  - 생성된 글로벌 영역이 N개라 해도 **모든 스레드에 의해 공유됨**
- **대표적인 글로벌 메모리 영역**
  - 테이블 캐시
  - InnoDB 버퍼 풀
  - InnoDB 어댑티브 해시 인덱스
  - InnoDB 리두 로그 버퍼

---

## 로컬 메모리 영역

- **세션 메모리 영역**이라 표현하며 MySQL 서버에 존재하는 **클라이언트 스레드가 쿼리를 처리하는 데 사용하는 메모리 영역**
  - 대표적으로 **커넥션 버퍼**와 **정렬 버퍼** 등이 존재함
- 클라이언트가 MySQL 서버에 접속하면 클라이언트 커넥션으로부터의 요청 처리를 위해 스레드를 하나씩 할당
  - 클라이언트 스레드가 사용하는 메모리 공간이라고 해서 클라이언트 메모리 영역이라고 부름
  - 클라이언트와 MySQL 서버와의 커넥션 = 세션 (세션 메모리 영역)
- 각 클라이언트 **스레드별로 독립적으로 할당**되며 스레드간 공유가 이뤄지지 않음
- 각 쿼리의 용도별로 **필요할 때만 공간이 할당**되고 필요하지 않으면 MySQL이 메모리 공간을 할당하지 않음
  - 커넥션이 열려 있는 동안 계속 할당된 상태로 남아 있는 공간이 존재함
    - 커넥션 버퍼나 결과 버퍼
  - 쿼리를 실행하는 순간에만 할당한 후 다시 해제하는 공간이 존재함
    - 소트 버퍼나 조인 버퍼
- **대표적인 로컬 메모리 영역**
  - 정렬 버퍼
  - 조인 버퍼
  - 바이너리 로그 캐시
  - 네트워크 버퍼