Optimizer
1 Optimizer
- MySQL 서버로 요청된 쿼리의 결과는 동일하지만 내부적으로 그 결과를 만들어내는 방법은 매우 다양하다
- 쿼리를 최적으로 실행하기 위해 각 테이블의 데이터가 어떤 분포로 저장되어 있는지 참조하면 최적의 실행 계획을 수립하는 작업을 Optimizer가 담당한다
1.1 실행계획
- MySQL에서는 EXPLAIN이라는 명령어로 쿼리의 실행 계획을 확인할 수 있다
2 쿼리 실행 절차
MySQL 서버에서 쿼리가 실행되는 과정은 크게 세 단계
- SQL 문장을 쪼개서 MySQL 서버가 이해할 수 있는 수준으로 분리한다
- SQL의 파싱 정보를 확인하면서 어떤 테이블을 읽고 어떤 인덱스를 이용해 테이블을 읽을지 선택
- 2단계에서 결정된 테이블의 읽기 순서나 선택된 인덱스를 이용해 스토리지 엔진으로부터 데이터를 가져온다
2.1 SQL 파싱
SQL 파서
라는 모듈이 처리한다- SQL 문장의 문법적인 잘못은 이 단계에서 걸러진다
- 1단계를 거치면 SQL 파스 트리가 만들어진다
- MySQL 서버는 SQL 문장 자체가 아니라 SQL 파스 트리를 이용해 쿼리를 실행한다
2.2 최적화 및 실행계획 수립
- 2단계는 Optimizer가 담당
- 2단계에서는 SQL 파스 트리를 참조하면서 아래와 같은 내용을 처리
- 불필요한 조건 제거 및 복잡한 연산 단순화
- 여러 테이블 조인 시 어떤 순서로 테이블을 읽을지 결정
- 각 테이블의 사용된 조건과 인덱스 통계 정보를 이용해 사용할 인덱스 결정
- 가져온 레코드를 임시 테이블에 넣고 다시 한번 가공해야 하는지 결정
2.3 실행
- 수립된 실행 계획대로 스토리지 엔진에 레코드를 읽어오도록 요청하고 MySQL 엔진에 서는 스토리지 엔진으로부터 받은 레코드를 조인하거나 정렬하는 작업 수행
- 3 단계는 MySQL 엔진과 스토리지 엔진이 동시에 참여
3 Optimizer의 종류
- 크게 비용 기반 최적화 방식과 규칙기반 최적화 방식으로 나눌 수 있다
- 현재 대부분의 DBMS는 비용 기반 최적화 방식을 채택하고 있다
3.1 Cost-Based Optimizer(CBO)
- 쿼리를 최적화하기 위한 여러가지 가능한 방법을 만들고 작업의 비용을 산출한다
- 실행 방법별로 비용이 최소로 소요되는 처리 방식을 선택해 최종적으로 쿼리를 실행한다
3.2 Rule-Based Optimizer(RBO)
- 대상 테이블의 레코드 건수나 선택을 고려하지 않고 옵티마이저에 내장된 우선순위에 따라 실행 계획을 세우는 방식
- 같은 쿼리에 대해서 항상 같은 실행 방법을 만들어 낸다
- RBO는 오래전부터 많은 DBMS에서 거의 사용되지 않는다