MySQL Architecture - Tirrilee/TechTalk GitHub Wiki

MySQL Architecture

MySQL Server

MySQL Server = MySQL Engine + Storage Engine


MySQL Engine

  • Connection Handler : Client로부터 접속 및 쿼리 요청 처리
  • SQL Parser
  • 전처리기
  • 옵티마이저 : 쿼리 최적화 실행
  • MyISAM : 키 캐시
  • InnoDB의 Buffer Pool : 보조 저장소 기능
  • MySQL에서 MySQL Engine은 1개

스토리지 엔진

  • 디스크 스토리지에 실제 데이터 저장
  • 디스크 스토리지부터 데이터를 읽어옴
  • 테이블이 사용할 스토리지 엔진을 지정하면 이후 해당 테이블의 모든 작업은 정의된 스토리지에서 처리

읽기 전용 테이블에서 굳이 Transaction이나 동시성을 요구할 필요가 없음 이처럼 엔진을 선택하여 테이블을 활용 할 수 있음

하지만 스토리지엔진을 잘못사용하면 트랜잭션이 잘못 사용될 수 있음


MySQL Threading

프로세스 기반이 아니라 Thread기반으로 동작한다.


Foreground (Client Thread)

  • MySQL에 접속된 클라이언트 수만큼 존재
  • 사용자가 요청하는 쿼리 문장을 처리 하는 것이 임무
  • 사용자가 작업을 마치고 Connection을 종료하면 해당 Thread는 Thread Cache로 감
  • Thread Cache에 있는 Thread의 개수를 유지하기 위해 thread_cache_size가 관리
  • 개수가 많으면 Thread를 종료시킴

  • 데이터를 MySQL의 데이터 버퍼나 캐시로부터 가져온다.
  • Buffer나 Cache에 없으면 직접 디스크에서 읽어와야한다.
  • MyISAM Table은 디스크 쓰기 작업까지 Foreground Thread가 처리
  • InnoDB Table은 Data Buffer나 Cache까지만 Foreground가 처리하고 나머지를 디스크에 기록하는 것은 Background Thread가 저리한다.

Background (Server Thread)


InnoDB는 여러가지 작업이 Background로 처리된다.

  • Insert Buffer를 병합
  • Log를 Disk로 기록
  • InnoDB Buffer pool의 데이터를 디스크에 기록하는 스레드
  • Data를 buffer로 읽어들이는 스레드
  • 여러가지 잠금이나 Deadlock을 모니터링하는 스레드
  • 이 모든 걸 총괄하는 메인 스레드

Log Thread와 Write Thread(버퍼의 데이터를 디스크로 내려쓰는 작업)의 개수를 설정 가능함

  • 윈도우 MySQL 5.0 이후부터 Thread를 1개 이상으로 설정 가능
  • Linux/Unix 계열은 5.1부터 1개 이상으로 설정 가능
  • innodb_write_to_threads & innodb_read_to_threads 로 지정가능

Read Thread

InnoDB에서는 데이터 작업은 주로 Client Thread에서 처리되기 때문에 Read Thread를 많이 설정할 필요 없음

Write Threading

아주 많은 작업을 백그라운드로 처리 > 일반적인 내장 디스크시 2~4 정도 DAS나 SAN과 같은 스토리지를 사용할 때는 4개 이상으로

SQL 처리는 Write는 지연가능하나 Read는 지연될 수 없음

InnoDB에서 쓰기는 버퍼링에 넣어놓고 한번에 처리 즉 데이터 변경시 Disk에 완전히 저장될 때까지 조회를 기다리지 않아도 괜찮음

MyISAM은 쓰기와 읽기과 함께 작업 & 쓰기 버퍼링이 없음 즉 데이터 변경시 기다려야함


MySQL 메모리 할당 및 사용 구조

글로벌 영역의 모든 메모리 공간은 MySQL 서버가 시작되면서 무조건 OS에 할당

글로벌과 로컬의 차이는 MySQL에 존재하는 많은 Thread가 공유해서 사용하는 공간인지 아닌지의 차이

  1. 글로벌 영역

보통 1개가 생성되는데, 2개 이상이 할당되더라도 Client Thread의 수와는 무관하고 모든 Thread에 공유된다.

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

MySQL 서버상에 존재하는 Client Thread가 쿼리를 처리하는데 사용하는 메모리 영역

+) Session = MySQL Server와 Client의 Connection

로컬 메모리는 각 Thread에 독립적이며, 메모리 영역을 크게 신경쓰지않는다.

+) 추가

  • Connection Buffer : 할당된 상태로 남아있음
  • Sort Buffer, Join Buffer : 쿼리를 실행하는 순간에 할당됬다가 해제

플러그 스토리지 엔진 모델

MySQL에서 쿼리가 실행될 때 거의 대부분의 작업이 MySQL Engine에서 처리되고, 마지막 "읽기/쓰기" 의 경우 Storage Engine에서 처리된다.

MySQL Engine이 Storage Engine을 조정하기 위해 Handler를 사용 (데이터 읽거나 쓰기 등의 장업을 할 때는 무조건 Handler를 거쳐야한다.)

MySQL의 Handler_ 라는 상태 변수는 MySQL Engine이 각 스토리지 엔진엑 보내는 명령어 횟수

실질적인 GROUP BY나 ORDER BY 등 많은 복잡한 처리 는 Storage Engine 영역이 아닌 MySQL Engine 처리 영역인 Query 실행기에서 처리

⚠️ **GitHub.com Fallback** ⚠️