Real MySQL 8.0

김종하·2023년 6월 19일
0

MySQL 아키텍처

MySQL 서버는 크게 MySQL 엔진스토리지 엔진으로 구분할 수 있다.

MySQL 엔진

MySQL 엔진은 요청된 SQL 문장을 분석하거나 최적화하는 등이 역할을 담당한다.

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

  • Connection Handler : 커넥션 및 쿼리 요청 처리 담당
  • SQL 인터페이스 : DML, DDL, Procedure, View 등 SQL 인터페이스 담당
  • SQL 파서 : SQL 문법 오류 탐지 및 SQL 쿼리를 MySQL 이 처리하기 좋은 토큰 단위로 나눠서 트리 형태로 파싱하는 작업 담당
  • SQL 옵티마이저 : 쿼리의 최적화된 실행
  • 캐시와 버퍼 : 성능 향상을 위한 보조 저장소 기능

스토리지 엔진

스토리지 엔진은 실제 데이터를 디스크 스토리지에 저장하거나 디스크 스토리지로부터 데이터를 읽어오는 역할을 담당한다. (ex) InnoDB, MyISAM

MySQL 엔진과 달리 복수개의 스토리지 엔진을 동시에 사용할 수 있으며 MySQL 엔진은 핸들러 API 를 통해 스토리지 엔진에 데이터 읽기 및 쓰기를 요청한다.

SHOW GLOBAL STATUS LIKE 'Handler%' 명령을 통해 각 핸들러 API 를 통한 요청이 얼마나 있었는지 확인할 수 있다

MySQL 스레딩 구조

MySQL 서버는 스레드 기반으로 작동하며 포그라운드(foreground)스레드와 백그라운드(background)스레드로 구분할 수 있다.

  • 포그라운드 스레드
    포그라운드 스레드는 최소한 MySQL 서버에 접속된 클라이언트 수만큼 존재
    주로 각 클라이언트 사용자가 요청하는 쿼리 문장을 처리한다.
    작업을 마치고 커넥션을 종료하면 커넥션을 담당하던 스레드는 스레드 캐시로 돌아간다.
    스레드 캐시에 유지할 수 있는 최대 스레드 개수는 thread_cache_size 시스템 변수를 통해 설정한다.
    포그라운드 스레드는 MySQL 데이터 버퍼나 캐시로부터 데이터를 가져오며 없는 경우 직접 디스크의 데이터나 인덱스 파일로부터 데이터를 읽어와 작업을 처리한다.
  • MyISAM 경우 디스크 쓰기 작업까지 포그라운드 스레드가 담당, InnoDB 는 디스크 기록은 백그라운스레드가 처리
  • 백그라운드 스레드
    InnoDB의 경우
    인서트 버퍼를 병합하는 스레드,
    로그를 디스크로 기록하는 스레드,
    InnoDB 버퍼 풀의 데이터를 디스크에 기록하는 스레드,
    데이터를 버퍼로 읽어오는 스레드,
    잠금이나 데드락을 모니터링하는 스레드가 백그라운드 스레드로 동작한다.

MyISAM 은 사용자 스레드가 쓰기 작업까지 함께 처리하도록 설계되어있는 반면 쓰기작업을 버퍼링해서 일괄처리할 수 있는 InnoDB 는 CUD 쿼리로 데이터가 변경되는 경우 데이터가 디스크의 데이터 파일로 저장될 때 까지 기다리지 않아도 된다.

메모리 구조

MySQL 메모리 공간은 크게 글로벌 메모리 영역과 로컬(세션)메모리 영역으로 구분할 수 있다.

  • 글로벌 메모리 영역
    MySQL 서버가 운영체제로 부터 할당받는 메모리는 MySQL 시스템 변수로 설정해 둔 만큼 받는다.
    모든 스레드에 공유되는 영역
  • 로컬 메모리 영역
    클라이언트 스레드가 쿼리를 처리하는데 사용하는 메모리 영역
    로컬 메모리는 각 클라이언트 스레드별로 독립적으로 할당되며 공유되지 않는다.

0개의 댓글