우리가 말하는 mysql은 mysql 서버이다.\
서버안에는 두뇌 역할을 하는 mysql 엔진이 들어가있고, 손발의 역할을 하는 스토리지 엔진이 존재한다.
두 엔진은 핸들러 api를 통해 통신한다.
우리가 sql을 작성하여 실행을하면, mysql 엔진에 한 부분인 쿼리 파서가 분석한다.
쿼리파서는 mysql 엔진이 인지할 수 있는 최소한의 단위인 토큰으로 분리하여 트리형태의 구조로 변경된다.
여기까지하면 토큰으로 이루어진 파스 트리가 생성된다.
다음으로 전처리기는 파서가 만든 트리를 기반으로 sql 구문의 유요성을 검증하고, 각 토큰의 테이블, 컬럼, 프로시저 등이 존재하는지 확인 및 객체에 대한 접근 권한이 있는지 확인한다.
검증을 마치고 옵티마이저에게 전달되고, 쿼리를 최적으로 실행하기 위한 쿼리 플랜을 수립하게 된다.
쿼리의 재작성, 테이블 스캔 순서, 사용할 인덱스 선택, 비용 기반 최적화, 규칙 기반 최적화 등을 거치며 쿼리 플랜으로 만들어지게 된다.
이제 쿼리 플랜을 실행 엔진이 스토리지 엔진과 통신하여 실행하게 된다.
스토리지 엔진은 실행 엔진의 요청을 처리하기 위해 디스크로부터 읽기/쓰기가 실행되고 여러 개를 동시에 실행가능하다.
// 스토리지 엔진은 멀티 쓰레드 가능, mysql 엔진은 불가능.
innodb 스토리지 엔진이란?
1. 버퍼 풀
- 최근에 사용된 결과물을 캐싱함.
- 쓰기 버퍼링 지원
2. mvcc / undo log
- 트랜잭션id와 데이터로 구성됨.
- 트랜잭션 id란 트랜잭션 실행순서마다 부여되는 id이다. 이 값으로 트랜잭션 실행 전 데이터를 복구하거나 불러올 수 있다.
- 하나의 레코드에 대한 여러개의 버전을 관리함.