MySQL Architecture - Tirrilee/TechTalk GitHub Wiki
MySQL Server = MySQL Engine + Storage Engine
- Connection Handler : Client로부터 접속 및 쿼리 요청 처리
- SQL Parser
- 전처리기
- 옵티마이저 : 쿼리 최적화 실행
- MyISAM : 키 캐시
- InnoDB의 Buffer Pool : 보조 저장소 기능
- MySQL에서 MySQL Engine은 1개
- 디스크 스토리지에 실제 데이터 저장
- 디스크 스토리지부터 데이터를 읽어옴
- 테이블이 사용할 스토리지 엔진을 지정하면 이후 해당 테이블의 모든 작업은 정의된 스토리지에서 처리
읽기 전용 테이블에서 굳이 Transaction이나 동시성을 요구할 필요가 없음 이처럼 엔진을 선택하여 테이블을 활용 할 수 있음
하지만 스토리지엔진을 잘못사용하면 트랜잭션이 잘못 사용될 수 있음
프로세스 기반이 아니라 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가 저리한다.
- 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 로 지정가능
InnoDB에서는 데이터 작업은 주로 Client Thread에서 처리되기 때문에 Read Thread를 많이 설정할 필요 없음
아주 많은 작업을 백그라운드로 처리 > 일반적인 내장 디스크시 2~4 정도 DAS나 SAN과 같은 스토리지를 사용할 때는 4개 이상으로
SQL 처리는 Write는 지연가능하나 Read는 지연될 수 없음
InnoDB에서 쓰기는 버퍼링에 넣어놓고 한번에 처리 즉 데이터 변경시 Disk에 완전히 저장될 때까지 조회를 기다리지 않아도 괜찮음
MyISAM은 쓰기와 읽기과 함께 작업 & 쓰기 버퍼링이 없음 즉 데이터 변경시 기다려야함
글로벌 영역의 모든 메모리 공간은 MySQL 서버가 시작되면서 무조건 OS에 할당
글로벌과 로컬의 차이는 MySQL에 존재하는 많은 Thread가 공유해서 사용하는 공간인지 아닌지의 차이
- 글로벌 영역
보통 1개가 생성되는데, 2개 이상이 할당되더라도 Client Thread의 수와는 무관하고 모든 Thread에 공유된다.
- 로컬 메모리 영역 (= 세션 메모리 영역)
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 실행기에서 처리