1. 알고자 하는 것
- MySQL 엔진
- 스토리지 엔진
- 쿼리의 전체적인 실행 구조
2. 알게된 것
MySQL 엔진
- 클라이언트, 서버 등에서 요청한 SQL 문장의 파싱 및 최적화를 수행
- DBMS의 두뇌로 비유
- 크게 커넥션 핸들러, SQL Parser, 전처리기, 옵티마이저로 구성
- 커넥션 핸들러 : 클라이언트와의 접속, 스토리지 엔진에게 데이터 R/W 쿼리 요청
- SQL Parser : 클라이언트가 요청한 쿼리를 MySQL이 인식할 수 있는 단위 (토큰)로 분리해 트리형태 구조로 파싱. 쿼리의 문법적 오류를 해당 SQL Parser가 발견하고 오류 전달
- 전처리기 : 파서 트리 내 토큰과 개체(컬럼명, 내장함수, 객체 접근권한)를 비교해 쿼리 문장의 구조적 오류 확인. 존재하지 않는 토큰, 권한 오류를 해당 전처리기가 발견하고 오류 전달
- 옵티마이저 : 클라이언트가 요청한 쿼리에 대해 최적(최저비용)의 처리경로(방법)을 결정하는 DBMS 내부의 핵심엔진. Index와 같은 처리는 결국 옵티마이저가 최적의 처리경로를 결정할 수 있도록 유도함으로써 성능의 향상을 꾀하는 것. 이렇게 옵티마이저가 생성한 최적의 처리경로를 실행계획(Execution Plan)이라 한다.
스토리지 엔진
- MySQL 서버의 가장 밑단에서 실제 디스크에 접근하여 데이터를 읽고, 디스크에 데이터를 쓰는, 디스크에 실질적으로 Read/Write 작업을 수행하는 역할
- MySQL의 대표적인 스토리지 엔진은 MyISAM과 InnoDB가 있으며, 기능과 성능 상 차이로 주로 InnoDB를 채택.
MySQL 엔진, 스토리지 엔진을 거쳐가는 쿼리의 전체적인 실행 구조
- 클라이언트의 SQL(쿼리) 요청
- SQL Parser가 쿼리를 토큰으로 분리해 파서 트리 구성. 쿼리의 문법적 오류 확인
- 파서 트리를 기반으로 전처리기가 쿼리의 구조적 오류 확인
- 옵티마이저가 Index와 같은 조건을 활용하여 쿼리 실행 비용 최적화. 실행계획 생성
- 스토리지 엔진에게 쿼리를 통한 실제 디스크 R/W 요청
- 스토리지 엔진이 디스크에서 R/W 수행
3. 정리
- 단순히 MySQL이 커넥션, 쿼리 파싱, 데이터 R/W을 수행한다고 생각하지 말자.
- MySQL의 아키텍처 내에서 각 작업이 수행되는 컴포넌트를 구분지어 기억하면 좋을 것이라고 생각한다.
- 실제 MySQL의 전체적인 동작을 분리된 역할로서 이해
- 이를 통해 쿼리 최적화 / 오류 디버깅 등에서 핵심이 되는 컴포넌트에만 집중할 수 있는 안목을 기를 수 있을 것
Reference
'Database' 카테고리의 다른 글
[Real MySQL, 6장 - 실행계획] type 컬럼 분석 (1) | 2023.12.19 |
---|---|
[MySQL] GROUP_CONCAT으로 grouping 한 결과를 한줄로 출력하기 (4) | 2023.11.19 |
[Real MySQL, 4장 - 트랜잭션과 잠금] MySQL에서의 트랜잭션 (0) | 2023.10.05 |
[Real MySQL, 3장 - 아키텍처] MySQL에서의 복제(Replication) (0) | 2023.09.22 |