개발/데이터베이스

[MySQL] 서버 구조와 동작 원리 - MySQL 엔진, 스토리지 엔진

선우. 2024. 6. 27. 17:09

1. MySQL 서버 전체 구조

MySQL 서버 전체 구조

MySQL 엔진

MySQL 엔진은 커넥션 관리, SQL 명령어 처리, 캐시 & 버퍼 관리, 스레드 관리 등을 담당합니다.

  • 커넥션 핸들러: MySQL 서버 사용자인 응용 프로그램과 커넥션을 체결합니다.
  • SQL 인터페이스: 사용자가 작성한 SQL 명령어를 DBMS 서버 내부로 전달합니다.
  • SQL 파서: SQL 명령어를 분석해 Syntax Tree를 형성한 뒤 옵티마이저에게 전달합니다.
  • SQL 옵티마이저: SQL 명령어를 최적화해 실행 계획을 세웁니다.
  • 캐시 & 버퍼: 데이터를 메모리에 저장하여 성능을 향상시킵니다.

 

스토리지 엔진

  • 데이터 저장 방식을 관리하고 실제 물리적 디스크에 접근합니다.
  • InnoDB와 MyISAM 등이 대표적인 스토리지 엔진입니다.

 

핸들러 API

  • MySQL 엔진과 스토리지 엔진은 둘 사이에 핸들러 API를 통해 데이터를 주고 받습니다.
  • MySQL 엔진은 일관된 핸들러 API를 호출함으로써 다양한 스토리지 엔진을 사용할 수 있습니다.
  • 핸들러 API 스펙에 맞춰 스토리지 엔진을 직접 구현해 사용할 수도 있습니다.

 

2. MySQL 스레딩 구조

MySQL 스레딩 구조

  1. MySQL 엔진 영역
    • Foreground Thread: 사용자와의 연결을 관리, SQL 요청을 처리하는 스레드
    • Thread Cache: 포그라운드 스레드를 재사용할 목적으로 보관하는 영역
    • Chache & Buffer: 데이터 및 인덱스 페이지를 메모리에 캐싱해 성능을 향상시킨다.
  2. 스토리지 엔진 영역
    • Background Thread: 스토리지 엔진에서 발생하는 다양한 백그라운드 작업을 처리하는 스레드 (InnoDB의 경우 더티 페이지 플러시, 로그 쓰기, 트랜잭션 정리 등을 처리)
    • Log Buffer: 트랜잭션 로그를 메모리에 임시로 저장하여 디스크에 기록하기 전에 성능을 향상시킨다.
    • Log File: 디스크에 저장된 트랜잭션 로그 파일
    • Data File: 디스크에 저장된 실제 데이터 파일

 

3. 읽기/쓰기 처리 흐름

읽기 작업 - SELECT

  1. Foreground Thread가 요청된 데이터를 버퍼 풀에서 찾는다.
  2. 버퍼 풀에 데이터가 존재하면 (캐시 히트) 바로 반환한다.
  3. 버퍼 풀에 데이터가 없으면 (캐시 미스) 디스크에서 데이터를 읽어와 버퍼 풀에 저장한 후 반환한다.

 

쓰기 작업 - INSERT, UPDATE, DELETE

  1. Foreground Thread가 변경된 데이터를 쓰기 지연 버퍼에 저장한다.
  2. 사용자에게 작업 완료 응답을 반환한다.
  3. Background Thread가 주기적으로 쓰기 지연 버퍼의 데이터를 디스크에 기록한다.

 

Reference

  • 도서 Real MySQL 8.0 - 4장 MySQL 엔진