개발 메모장

MySQL 아키텍처 본문

DBMS/MySQL

MySQL 아키텍처

hugo(박기태) 2024. 8. 30. 19:00

이번 글에서는 MySQL 아키텍처에 대해 알아보겠습니다.


1. MySQL 아키텍처

MySQL의 아키텍처는 크게 2가지로 나눌 수 있습니다.

1.1 MySQL 엔진

요청된SQL 문장을 분석하고 최적화하는 등의 작업을 수행합니다.

MySQL 엔진은 다음의 요소들로 구성되어 있습니다.

  • 쿼리 파서: 요청된 쿼리 문장을 토큰으로 분리 하여 파서 트리로 만드는 작업을 수행합니다.
  • 전처리기: 파서 트리를 기반으로 쿼리 문장에 구조적인 문제점이 있는지 확인합니다.
  • 옵티마이저: 쿼리 문장을 어떻게 실행할지 계획을 작성합니다.
  • 실행 엔진: 계획을 바탕으로 핸들러 API를 호출합니다.

1.2 스토리지 엔진

실제 데이터를 디스크 스토리지에 저장하거나 읽어오는 작업을 수행합니다.

MySQL의 경우 스토리지 엔진을 플러그인해서 사용할 수 있으며, 동시에 여러 개를 사용할 수 있습니다.

다음은 대표적인 MySQL의 스토리지 엔진입니다.

  • InnoDB
  • MyISAM

2. 스레딩 구조

MySQL은 스레드 기반으로 작동하며 크게 2가지로 나눌 수 있습니다.

2.1 포그라운드 스레드(Foreground Thread)

클라이언트 스레드라고도 하며, 각 클라이언트 사용자가 요청하는 쿼리 문장을 처리합니다.

데이터 버퍼나 캐시에 접근하여 데이터를 가져오며, 데이터가 존재하지 않는다면 디스크의 데이터나 인덱스 파일로부터 데이터를 가져옵니다.

스레드 캐시(Thread cache)를 통해 스레드 생성 및 소멸로 인한 오버헤드를 줄이며, thread_cache_size 시스템 변수로 스레드 캐시의 크기를 지정할 수 있습니다.

2.2 백그라운드 스레드(Background Thread)

스토리지 엔진에 따라 처리되는 작업이 다릅니다.


3. 메모리 구조

MySQL의 메모리 역시 크게 2가지로 나눌 수 있습니다.

3.1 글로벌 메모리 영역

모든 스레드가 공유하는 영역으로 다음과 같은 영역이 존재합니다.

  • 테이블 캐시

3.2 로컬 메모리 영역

세션 메모리 영역이라고도 하며, 포그라운드 스레드별로 할당되는 영역입니다. 다음과 같은 영역이 존재합니다.

  • 정렬 버퍼
  • 조인 버퍼
  • 바이너리 로그 캐시
  • 네트워크 버퍼

로컬 메모리 영역은 항상 실제 메모리에 할당되지 않고 필요한 경우에만 할당될 수 있습니다.

4. 기타

플러그인 아키텍처

MySQL의 특징 중 하나로 스토리지 엔진뿐 아니라 검색어 파서, 사용자 인증 등이 플로그인으로 구현되어 제공됩니다. 뿐만 아니라 직접 구현하여 사용할 수도 있습니다.

하지만 MySQL 8.0부터는 아래의 문제점으로 인해 컴포넌트 아키텍처를 지원합니다.

  • 플러그인끼리 통신 불가
  • MySQL 서버의 변수나 함수를 직접 호출(캡슐화 X)
  • 상호 의존 관계 설정 불가로 초기화 어려움

쿼리 캐시

클라이언트의 쿼리 결과를 메모리에 캐시하는 기능이었으나, 실제 사용성이 적고 동시 처리 성능 저하로 인해 MySQL 8.0에서 제거되었습니다.

스레드 풀

MySQL 커뮤니티 에디션에서는 지원하지 않으며 Percona Server 플러그인이나 엔터프라이즈 에디션을 사용해야 합니다.

컨텍스트 스위칭의 오버헤드를 막기 위해 사용됩니다.

메타데이터 관리

메타데이터는 테이블의 구조 정보와 스토어드 프로그램 등의 정보를 의미합니다.

MySQL 5.7까지는 메타데이터를 FRM 파일을 통해 관리했지만, 파일 기반은 트랜잭션을 지원하지 않아 정합성이 깨지는 일이 발생할 수 있었습니다.

MySQL 8.0에서는 메타데이터를 InnoDB의 경우 테이블을 통해 관리하고, 다른 스토리지 엔진의 경우 SDI 파일을 통해 관리하고 있습니다.


이번 글에서는 MySQL 아키텍처에 대해 알아보았습니다. 다음 글에서는 MySQL의 스토리지 엔진인 InnoDB에 대해 알아보겠습니다.


참고자료

Real MySQL 8.0 1권

'DBMS > MySQL' 카테고리의 다른 글

InnoDB  (0) 2024.09.09