9.1 개요
실행 계획을 이해할 수 있어야 불합리한 부분을 찾아내고 더 최적화된 방법으로 실행 계획을 유도할 수 있다.
9.1.1 쿼리 실행 절차
MySQL 서버에서 쿼리가 실행되는 과정
- 사용자로부터 요청된 SQL 문장을 잘게 쪼개서 MySQL 서버가 이해할 수 있는 수준으로 분리한다. (파스 트리)
- SQL 파싱 단계라고 하며 SQL 파서 모듈로 처리한다.
- SQL의 파싱 정보(파스 트리)를 확인하면서 어떤 테이블로부터 읽고 어떤 인덱스를 이용해 테이블을 읽을지 선택한다.
- 최적화 및 실행 계획 수립 단계로 옵티마이저가 처리한다.
- 대표적인 작업
- 불필요한 조건 제거 및 복잡한 연산 단순화
- 여러 테이블의 조인이 있는 경우 테이블 읽는 순서 결정
- 각 테이블 사용 조건과 통계 정보를 통해 사용할 인덱스 결정
- 가져온 레코드를 임시 테이블에 넣고 다시 한 번 가공해야 하는지 결정
- 2단계에서 결정된 테이블의 읽기 순서나 선택된 인덱스를 이용해 스토리지 엔진으로부터 데이터를 가져온다.
9.1.2 옵티마이저 종류
- 규칙 기반 최적화(Rule-based optimizer)
- 옵티마이저에 내장된 우선순위에 따라 실행 계획을 수립
- 대상 테이블의 레코드 건수나 선택도 등을 고려하지 않는다.
- 하지만 사용자 데이터 분포도는 매우 다양하기에 오래전부터 사용되지 않는 방식이다.
- 비용 기반 최적화(Cost-based optimizer)
- 쿼리를 처리하기 위한 여러 방법을 만들고 각 방법의 비용 정보와 테이블의 예측 통계 정보를 이용해 실행 계획별 비용을 산출한다.
- 산출된 비용 중 가장 적은 비용이 드는 방식을 최종적으로 선택해 쿼리를 실행한다.
- 대부분의 RDBMS가 채택하는 방식이다.