MySQL에서 쿼리를 최적으로 실행하기 위해 기본 데이터를 비교해 최적의 실행 계획을 수립하는 작업을 옵티마이저가 한다.
사용자로부터 요청된 SQL 문장을 잘게 쪼개서 MySQL 서버가 이해할 수 있는 수준으로 분리한다.
SQL 파서라는 모듈로 처리한다.
SQL 파스 트리가 만들어 진다.
InnoDB 스토리지 엔진은 특정 테이블의 연속된 데이터 페이지가 읽히면 백그라운드 스레드에 의해 리드 어헤드 작업이 자동으로 시작된다.
리드 어헤드란 어떤 영역의 데이터가 앞으로 필요해지리라는 것을 예측해서 요청이 오기 전에 미리 디스크에서 읽어 InnoDB의 버퍼 풀에 가져다 두는 것을 의미한다.
포그라운드 스레드는 미리 버퍼 풀에 준비된 데이터를 가져다 사용하기만 하면 되므로 쿼리가 빨리 처리된다.
리드 어헤드는 풀 인덱스 스캔에도 동일하게 사용된다.
병렬 처리는 하나의 쿼리를 여러 스레드가 작업을 나누어 동시에 처리하는 것을 의미한다.
MySQL 8.0 에서는 아무런 where 조건 없이 단순히 테이블의 전체 건수를 가져오는 쿼리만 병렬로 처리할 수 있다.
ex. SELECT COUNT(*) FROM employees;
병렬 처리용 스레드 개수를 CPU 코어 개수보다 크게 설정하면 성능이 떨어진다.
MySQL은 정렬을 수행하기 위해 소트 버퍼라는 별도의 메모리 공간을 할당받아 사용한다.
소트 버퍼는 정렬이 필요한 경우에만 할당되는 가변적인 공간이며, 쿼리 실행이 완료되면 즉시 반납된다.
정렬해야 할 레코드 건수가 소트 버퍼 공간보다 크다면, 레코드를 여러 조각으로 나눠서 처리하는데, 이때 임시 저장을 위해 디스크를 사용한다. 정렬하고 병합하는 과정에서 디스크 읽기, 쓰기가 유발된다.
소트 버퍼를 크게 설정하면 더 빨라질것 같지만, 소트 버퍼는 세션 메모리이므로 클라이언트마다 할당되는 공간이라 크게 설정하면 메모리 부족 현상을 겪을 수도 있다.