[MySQL] 아키텍처

kwang-sub·2024년 2월 13일

MySQL 8.0

목록 보기
4/14

엔진 구조

MySQL은 머리 역할을 담당하는 MySQL엔진과 손발 역할을 담당하는 스토리지 엔진이 있다. MySQL엔진은 서버당 하나만 가지고 스토리지 엔진은 여러개를 동시에 사용할 수 있다.

MySQL엔진
클라이언트로부터 접속 및 쿼리 요청을 처리하는 커넥션 핸들러, SQL 파서 및 전 처리기, 쿼리 최적화를 위한옵티마이저가 중심을 이룬다.

스토리지엔진
실제 데이터를 디스크 스토리지에 저장하거나 디스크 스토리지로부터 데이터를 읽어오는 부분을 담당한다.

핸들러 API
MySQL엔진(머리)가 스토리지엔진(손,발)에 요청을 하기 위한 방법으로 두 엔진은 핸들러 API를 통해 소통한다.

스레딩 구조

MySQL 서버는 스레드 기반으로 작동하며 크게 포그라운드 스레드, 백그라운드 스레드로 나뉜다.

포그라운드 스레드
MySQL 서버에 접속된 클라이언트는 하나의 포그라운드 스레드를 갖는다.
포그라운드 스레드는 사용자 요청에 따라 버퍼나 캐시에서 데이터를 읽는 작업을 하며 MyISAM 테이블은 디스크에 쓰기 작업까지 한다.
InnoDB 테이블은 버퍼에 쓰기까지는 가능하지만 디스크에 쓰기 작업은 백그라운드 스레드가 해준다.

클라이언트가 작업을 종료하면 스레드 캐시에 반납한다. 스레드 캐시에 숫자는thread_cache_size 시스템 변수를 통해 설정한다.

백그라운드 스레드
InnoDB 엔진이 동작할 때 주로 사용되며 아래와 같은 동작을 한다.

  • 인서트 버퍼를 병합하는 스레드
  • 로그를 디스크로 기록하는 스레드
  • InnoDB 버퍼 풀의 데이터를 디스크에 기록하는 스레드
  • 데이터를 버퍼로 읽어 오는 스레드
  • 잠금이나 데드락을 모니터링하는 스레드

이 중 데이터 베이스에 변경 사항을 기록하는 로그 스레드와 버퍼의 데이터를 디스크로 내려쓰는 작업을 처리하는 쓰기 스레드가 중요한 작업을 하는 스레드이다.

또한 MySQL에서 쓰기 작업은 일반적인 상용 DBMS에서 지연(버퍼링)되어 일괄 처리하는 기능을 지원한다.

쿼리 실행 구조

쿼리 파서
사용자 요청으로 들어온 쿼리 문장을 토큰으로 분리해 트리 형태의 구조로 만들어 내는 작업을 한다. 쿼리의 기본 문법 오류를 잡아내는 역할을 한다.

전처리기
쿼리 파서가 만든 파서 트리를 기반으로 쿼리 문장에 구조적인 문제점(테이블명, 컬럼명, 내장함수등)을 확인하며 없는 객체이거나 권한 여부를 확인하는 작업을 한다.

옵티마이저
사용자의 요청으로 들어온 쿼리 문장을 어떻게 하면 저렴한 비용으로 가장 빠르게 처리할지 방법을 결정하는 작업을 한다. 사람으로 비유하면 두뇌와 같으며 중요한 역할을 한다.

실행 엔진
옵티마이저가 결정한 방법을 핸들러에게 요청하는 작업을 한다. 이는 중간 관리자에 역할을 한다고 생각하면 된다.

핸들러(스토리지 엔진)
실제 동작을 실행하는 역할을 하며 실행 엔진에 요청에 따라 데이터를 디스크로 저장하고 디스크로부터 읽어 오는 작업을 한다. 여러 스토리지 엔진이 있지만 InnoDB 스토리지 엔진이 기본 값이다.

profile
백엔드 개발일지

0개의 댓글