MySQL 의 서버는 사람의 머리 역할을 담당하는 MySQL 엔진
과 손발 역할을 담당하는 스토리지 엔진
으로 구분된다. 일반적으로 사용하는 InnoDB 엔진은 스토리지 엔진의 한 종류이다.
MySQL 서버의 전체 구조
외부에서 받아온 쿼리문을 MySQL 엔진에서 효율적으로 처리하는 방법을 고안하고 실행한다. MySQL 엔진 내의 쿼리 실행기에서는 실제로 쿼리문을 동작하는데, 스토리지 엔진에 데이터를 처리하기 위해서 핸들러 API 로 통신한다. 핸들러 API 만 사용한다면 어느 스토리지 엔진을 사용하더라도 동일하게 사용할 수 있다.
MySQL 엔진 <-- (핸들러 API) --> 스토리지 엔진
클라이언트로부터 쿼리 실행 요청이 들어오면 다음과 같은 과정을 거친다.
쿼리 실행 구조
쿼리 파서
: 사용자 요청으로 들어온 쿼리 문장을 토큰(MySQL 이 인식할 수 있는 최소 단위의 어휘나 기호) 으로 분리해 트리 형태의 구조로 만들어 낸다. 쿼리 파서 단계에서 SQL 문법 오류를 탐색한다.전처리기
: 파서 과정에서 만들어진 파서 트리를 기반으로 쿼리 문장에 구조적인 문제점이 있는지 확인한다. 테이블 이름이나 컬럼 이름, 내장 함수와 같은 개체를 매핑해 해당 객체의 존재 여부와 객체의 접근 권한 등을 확인한다.옵티마이저
: 사용자의 요청으로 들어온 쿼리 문장을 어떻게 해야 가장 빠르게 처리할 수 있는지 결정한다. 실질적인 DBMS 의 두뇌 역할을 한다.실행 엔진
: 옵티마이저가 계획한 실행 계획대로 요청받은 결과를 핸들러에게 요청하는 역할이다.
핸들러(스토리지 엔진)
: MySQL 서버의 가장 밑단에서 MySQL 실행 엔진의 요청에 따라 데이터를 디스크로 저장하고 읽어오는 역할이다.InnoDB 구조
InnoDB 는 MySQL 의 스토리지 엔진 중 거의 유일하게 레코드 기반의 잠금을 제공하여 높은 동시성 처리가 가능하고 안정적이며 성능이 뛰어나다. 모든 테이블은 기본적으로 프라이머리 키를 기준으로 클러스터링 되어 저장되기 때문에 프라이머리 키를 사용하여 조회할 경우 처리 속도가 매우 빠르다. 다른 스토리지 엔진과는 달리 외래키도 지원한다. InnoDB 에서 외래키는 부모 테이블과 자식 테이블 모두 해당 컬럼에 인덱스가 필요하다.