MySQL 서버는 사람의 머리 역할을 담당하는 MySQL 엔진과, 손발 역할을 담당하는 스토리지 엔진으로 구분할 수 있다
MySQL 전체 구조
MySQL 엔진
클라이언트로부터의 접속 및 쿼리 요청을 처리하는 커넥션 핸들러와 SQL 파서 및 전처리기, 쿼리의 최적화된 실행을 위한 옵티마이저가 중심을 이룬다.
-> MySQL 엔진은 요청된 SQL 문장을 분석하거나 최적화하는 등 DBMS의 두뇌에 해당하는 처리를 수행
스토리지 엔진
데이터를 디스크 스토리지에 저장하거나 디스크 스토리지로부터 데이터를 읽어오는 부분은 스토리지 엔진이 전담한다.
MySQL 엔진
MySQL Threading 구조
MySQL 서버는 프로세스 기반이 아니라 스레드 기반으로 작동
Foreground thread
주로 각 클라이언트 사용자가 요청하는 쿼리 문장을 처리한다.
데이터를 MySQL의 데이터 버퍼나 캐시로부터 가져오며, 버퍼나 캐시에 없는 경우에는 직접 디스크의 데이터나 인덱스 파일로부터 데이터를 익어와서 작업을 처리
InnoDB 테이블은 데이터 버퍼나 캐시까지만 포그라운드 스레드가 처리, 나머지 버퍼로부터 디스크까지 작업은 백그라운드 스레드가 처리
Background thread
다양한 역할을 하지만 그중에서도 가장 중요한 것은 로그 스레드(log thread)와 버퍼의 데이터를 디스크로 내려쓰는 작업을 처리하는 쓰기 스레드(write thread) 일 것이다.
InnoDB 스토리지 엔진 아키텍처
InnoDB는 MySQL에서 사용할 수 있는 스토리지 엔진 중 거의 유일하게 레코드 기반의 잠금을 제공
특징
primary key - clustering
프라이머리 키를 기준으로 클러스터링 되어 저장 즉, 프라이머리 키 값의 순서대로 디스크에 저장된다는 뜻
프라이머리 키를 이용한 레인지 스캔이 상당히 빨리 처리될 수 있다.
외래 키 지원
InnoDB에서 외래 키는 부모 테이블과 자식 테이블 모두 해당 칼럼에 인덱스 생성이 필요하고, 변경 시에는 반드시 부모 테이블이나 자식 테이블에 데이터가 있는지 체크하는 작업이 필요하므로 잠금이 여러 테이블로 전파되고, 그로 인해 데드락이 발생할 때가 많으므로 개발할 때도 외래 키의 존재에 주의하는 것이 좋다.
MVCC(multi version concurrency control)
잠금을 사용하지 않는 일관된 읽기를 제공, InnoDB는 언두로그(Undo log)를 이용해 이 기능을 구현한다.