옵티마이저의 실행 계획
쿼리 실행 순서
- 사용자가 요청한 SQL 질의를 MySQL 서버가 이해할 수 있도록 분리(파스 트리)한다.
- 비용 기반 최적화를 진행한다. 질의를 수행할 수 있는 방법을 만들어, 각 방법의 통계 정보를 이용해 실행 계획별 비용을 산출하고 결정한다.
- 조인 순서 결정
- 어떠한 인덱스를 사용할 지, 인덱스를 바탕으로 스캔 방식을 결정한다.
- 임시 테이블을 생성해야 하는지 정한다, ..
- 결정된 실행 계획을 바탕으로
- 스토리지 엔진 : 필요한 데이터를 레코드를 가져온다.
- MySQL 엔진 : 가져온 레코드를 조인, 정렬하는 작업을 수행한다.
포어/백그라운드 스레드
포어그라운드 스레드는 클라이언트와 1:1로 매칭되어 아래와 같은 역할을 수행한다.
- 옵티마이저는 포어그라운드 스레드 위에서 돌아간다.
따라서 SQL 파싱, 실행 계획 수립, 스토리지 엔진에 디스크로 부터 읽어와달라는 API 요청, 결과 집합 조립 및 클라이언트로 응답이 이루어짐.
- WRITE 시 버퍼풀, 리두 로그, 언두 로그까지만 데이터를 쓴다.
- READ 시 버퍼풀에 있는지 확인하고 → innodb_read_ahead_threshold 개수의 페이지만큼만 디스크에서 읽고 백그라운드 스레드에게 그 다음부터 읽어달라고 요청한다.
백그라운드 스레드는 말그대로 뒷 단에서 필요한 작업들을 수행한다. 너무 많아 대표적인 것들만 작성했다.
- 로그 작업
- Redo Log Buffer를 디스크의 리두 로그 파일에 기록한다.
- 언두 로그를 정리한다.
- 버퍼풀 비우기
- 읽기
- 포어그라운드 스레드로 부터 받은 리드 어헤드 요청을 처리한다.
- 데드락 감지
리드 어헤드와 공간 지역성, 병렬 처리

리드 어헤드로 읽기 위해 포어그라운드 스레드가 백그라운드 스레드로 디스크의 페이지들을 읽어와달라고 요청했을 때 포어그라운드는 블로킹되는 것이 아닌 계속해서 버퍼풀을 읽는 작업을 수행하며 백그라운드 스레드와 병렬로 진행한다.
