서버에서 SQL 요청이 오면 MySQL 엔진(판단과 명령을 내리는 두뇌), 스토리지 엔진(동작을 수행하는 팔과 다리)을 거쳐 운영체제를 통해 디스크에 접근하여 데이터를 서버에게 전달
MySQL 엔진
쿼리파서
- SQL을 파싱하여 Syntax Tree를 만듬
- 이 과정에서 문법 오류 검사가 이루어짐
전처리기
- 쿼리파서에서 만든 Tree를 바탕으로 전처리 시작
- 테이블이나 컬럼 존재 여부, 접근권한 등 Semantic 오류 검사
= 쿼리파서, 전처리기는 컴파일 과정과 매우 유사하나 SQL은 프로그래밍 언어처럼 컴파일 타임 때 검증 할 수 없어 매번 구문 평가를 진행
옵티마이저
- 쿼리를 처리하기 위한 여러 방법들을 만들고, 각 방법들의 비용정보와 테이블의 통계정보를 이용해 비용 산정
- 테이블 순서, 불필요한 조건 제거, 통계 정보를 바탕으로 전략을 결정 (실행 계획 수립)
- 옵티마이저가 어떤 전략을 결정하느냐에 따라 성능이 많이 달라짐
- 가끔씩 성능이 나쁜 판단을 해 개발자가 힌트를 사용해 도움을 줄 수 있음
쿼리실행기
- 옵티마이저가 결정한 계획대로 스토리지 엔진에 요청하는 역할
Handler API
- MySQL 엔진의 쿼리 실행기에서 데이터를 쓰거나 읽거나 할 때는 각 스토리지 엔진에 쓰기 또는 읽기를 요청 하게 되며, 이러한 요청을 핸들러(Handler) 요청이라고 하고, 여기서 사용 되는 API
- InnoDB 스토리지 엔진도 Handler API 를 이용해 MySQL 엔진과 데이터를 주고 받음
스토리지 엔진
- 디스크에서 데이터를 가져오거나 저장하는 역할
- MySQL 스토리지 엔진은 플러그인 형태로 Handler API만 맞춘다면 직접 구현해서 사용 가능
- InnoDB, Mylsam 등 여러개의 스토리지 엔진이 존재, 8.0부터는 InnoDB가 디폴트
InnoDB
- Clustered Index
- Redo - Undo
- Buffer pool