# MySQL 아키텍처
> 개념들이 익숙하지 않다. 추후에 내부적으로 어떻게 동작하는지 알아보면 좋겠다.
# MySQL 아키텍처
- 데이터베이스는 파일을 관리하는 서버다.
- 서버는 MySQL Connector, SQL을 통해 MySQL 서버에 요청을 한다.
## MySQL 서버
- MySQL 엔진 -> 스토리지 엔진 -> 운영체제 -> 디스크
## MySQL 엔진 구성요소
- 쿼리파서, 전처리기, 옵티마이저, 쿼리실행기
### 쿼리파서
- SQL을 파싱해서 syntax tree를 만든다.
- 이 과정에서 문법 오류 검사를 한다.
### 전처리기
- 쿼리파서에서 만든 트리를 바탕으로 전처리 시작
- 테이블이나 칼럼 존재 여부, 접근 권한 등 semantic 오류 검사
- semantic: 요소가 특정 위치에 있거나 특정 구조를 띌 때 어떤 의미를 갖냐를 말하는 것
-> 쿼리파서, 전처리기는 컴파일 과정과 유사하다. 하지만 SQL은 프로그래밍 언어처럼 컴파일 타임 때 검증할 수 없어서 매번 구문 평가를 진행한다. 왜냐하면 서버 쪽에서 동적으로 SQL문으로 요청이 오기 때문
### 옵티마이저
- 쿼리를 처리하기 위한 여러 방법들을 만들고, 각 방법들의 비용 정보와 테이블의 통계 정보를 이용해 비용을 산정한다.
- 테이블 순서, 불필요한 조건 제거, 통계 정보를 바탕으로 전략 결정 -> 실행 계획 수립
### 쿼리실행기
- 옵티마이저가 결정한 계획대로 스토리지 엔진에 요청하는 역할
- 이때 Handler API를 이용한다.
### MySQL의 쿼리 캐시
- 5버전까지는 쿼리캐시가 있었다.
- 쿼리캐시란? SQL에 해당하는 데이터를 저장하는 것
- 쿼리캐시는 데이터를 캐시하기 때문에 테이블의 데이터가 변경되면 캐시의 데이터도 함께 갱신시켜줘야 한다. -> 성능 최적화를 위해 캐시라는 기술을 도입한 사례다. (참고: 오라클의 소프트캐싱)
- 캐시를 도입할 때는 항상 만료 정책을 고려해야 한다.
- 캐시의 범위를 어떻게 잡냐에 따라서 조회 성능과 쓰기 성능의 균형이 달라진다. (모든 기술은 트레이드 오프)
### 스토리지 엔진
- 디스크에서 데이터를 가져오거나 저장하는 역할
- MySQL 스토리지 엔진은 플러그인 형태로 Handler API만 맞춘다면 직접 구현해서 사용할 수 있다.
- InnoDB, MyIsam 등 여러 개의 스토리지 엔진이 존재
- 8.0부터 InnoDB 엔진이 디폴트
### InnoDB 엔진 핵심 키워드
- Clustered Index
- Redo - Undo
- Buffer pool