MySQL 엔진 아키텍처

Photo by Echo. Wang on Unsplash

MySQL 엔진 아키텍처

Real MySQL 8.0 스터디-2

💡
이 글은 Real MySQL 8.0공식 문서를 읽고 개인적으로 정리한 내용입니다.

1. 메모리 할당 및 사용 구조

MySQL에서 사용되는 메모리 공간은 크게 글로벌 메모리 영역과 로컬 메모리 영역으로 구분할 수 있습니다.

1.1. 글로벌 메모리 영역

글로벌 메모리 영역의 모든 메모리 공간은 MySQL 서버가 시작되면서 운영체제로부터 할당되며, 일반적으로 클라이언트 스레드의 수와 무관하게 하나의 메모리 공간만 할당됩니다. 필요에 따라 N개의 메모리 공간을 할당받을 수도 있지만 클라이언트의 스레드 수와는 무관하며, 모든 스레드에 의해 공유됩니다. 대표적인 글로벌 메모리 영역은 다음과 같습니다.

  • 테이블 캐시: MySQL 서버에서 사용되는 각 테이블의 메타 정보를 담고 있는 캐시

  • InnoDB 버퍼 풀: InnoDB가 액세스할 때 테이블 및 인덱스 데이터를 캐싱되는 메인 메모리 영역

  • InnoDB 어댑티브 해시 인덱스: 자주 사용되는 컬럼을 해시로 정의하여 B-Tree를 타지 않고 바로 데이터에 접근하는 인덱스

  • InnoDB 리두 로그 버퍼: 데이터베이스 변경사항에 대한 정보를 저장

1.2. 로컬 메모리 영역(세션 메모리 영역)

MySQL 서버상에 존재하는 클라이언트 스레드가 쿼리를 처리하는 데 사용하는 메모리 영역입니다. 로컬 메모리는 각 클라이언트 스레드 별로 독립적으로 할당되며 절대 공유되어 사용되지 않습니다. 대표적인 로컬 메모리 영역은 다음과 같습니다.

  • 정렬 버퍼: 정렬을 수행하기 위한 별도 메모리 공간

  • 조인 버퍼: 조인 연산을 수행할 때 사용되는 메모리 영역

  • 바이너리 로그 캐시: 바이너리 로그(binary log)를 기록할 때 사용되는 메모리 영역

  • 네트워크 버퍼: 클라이언트와 서버 간의 통신에 사용되는 메모리 영역

2. 플러그인 스토리지 엔진 모델 & 컴포넌트

MySQL은 플러그인(plugin) 시스템을 제공하여 기능을 확장하고 사용자 정의 기능을 추가할 수 있습니다. MySQL 플러그인은 독립적인 모듈로서 특정 작업을 수행하거나 기능을 제공하기 위해 사용됩니다. 플러그인은 MySQL 서버에서 동적으로 로드되어 실행될 수 있습니다. 플러그인에 대한 자세한 정보는 MySQL 메뉴얼을 참고해 주세요.

MySQL 8.0은 기존의 플러그인 아키텍처를 대체하기 위해 컴포넌트 아키텍처가 지원됩니다. 컴포넌트에 대한 자세한 사항은 메뉴얼을 참조해 주세요.

3. 쿼리 실행 구조

쿼리를 실행하는 관점에서 MySQL의 서버를 다음과 같이 기능별로 나눠 볼 수 있습니다.

  • 쿼리 파서: 쿼리 문장을 토큰으로 분리해 트리 형태의 구조로 변환

  • 전처리기: 파서 과정에서 만들어진 파서 트리를 기반으로 쿼리 문장에 구조적인 문제점이 있는지 확인

  • 옵티마이저: 쿼리 문장을 저렴한 비용으로 가장 빠르게 처리할지를 결정하는 역할

  • 실행 엔진: 옵티마이저에서 만들어진 계획대로 각 핸들러에게 요청해서 받은 결과를 또 다른 핸들러 요청의 입력으로 연결하는 역할

  • 핸들러: 데이터를 디스크로 저장하고 디스크로부터 읽어 오는 역할

4. 스레드 풀

스레드 풀은 내부적으로 클라이언트의 요청을 처리하는 스레드 개수를 줄여서 동시 처리되는 요청이 많다하더라도 MySQL 서버의 CPU가 제한된 개수의 스레드 처리에만 집중할 수 있게 해서 서버의 자원 소모를 줄이는 것이 목적입니다. 스레드 그룹의 모든 스레드가 일을 처리하고 있다면 스레드 풀은 해당 스레드 그룹에 새로운 작업 스레드를 추가할지, 아니면 기존 스레드가 처리를 완료할 때까지 기다릴지 여부를 판단해야 합니다. 스레드 시스템 변수를 적절히 조절하여 MySQL 서버 성능을 높일 수 있습니다.

5. 트랜잭션 지원 메타데이터

데이터베이스 서버에서 테이블의 구조 정보와 스토어드 프로그램 등의 정보를 데이터 딕셔너리 또는 메타데이터라고 합니다. MySQL 8.0부터는 메타데이터를 모두 InnoDB의 테이블에 저장합니다. 시스템 테이블과 데이터 딕셔너리 정보를 모두 모아서 mysql DB에 저장하고, mysql DB는 통째로 mysql.ibd라는 이름의 테이블스페이스에 저장됩니다.


🎯정리

  • MySQL의 메모리 공간은 글로벌 메모리 영역, 로컬 메모리 영역으로 구분됩니다.

  • 플러그인과 플러그인 아키텍처를 대체하기 위한 컴포넌트라는 것이 있다는 것을 알아봤습니다.

  • 쿼리 실행 구조는 다음과 같습니다. 쿼리 파서 -> 전처리기 -> 옵티마이저 -> 실행엔진 -> 핸들러가 실행 엔진의 명령에 따라 역할 수행

  • 매 요청마다 새로운 스레드를 생성하면 컨텍스트 스위칭 관련 비용이 커져서 MySQL 서버 성능이 저하되므로, 시스템 변수를 적절히 조절하여 스레드의 개수를 제한시킬 수 있습니다.

  • MySQL 8.0부터는 메타데이터를 모두 InnoDB의 테이블에 저장합니다.


🔖참고