MySQL 서버로 요청된 쿼리의 결과를 내부에서 만드는 방법은 다양한데, 여러 가지 중 최적의 방법으로 결과를 만들어내야 한다. 이렇게 최적의 실행 계획을 수립하는 기능은 옵티마이저가 담당한다.
MySQL 서버가 사용자의 요청을 처리하기 위해 데이터를 가공하는 기본 절차와 빠른 성능을 보장하기 위해 수행하는 최적화에 대해 살펴보자.
쿼리 실행 절차
1.
SQL 파싱
•
사용자로부터 요청된 SQL 문장을 잘개 쪼개서 MySQL 서버가 이해할 수 있는 수준으로 분리(Parse Tree) 한다.
◦
이 과정을 SQL 파싱이라하며, SQL 파서라는 모듈로 처리한다.
◦
문법적 오류는 이 단계에서 걸러진다.
◦
이 과정이 완료되면 SQL 파스 트리가 만들어진다.
◦
즉, MySQL은 SQL 문장이 아닌 SQL 파스 트리를 이용해 쿼리를 실행한다.
2.
최적화 및 실행 계획 수립
•
SQL의 파싱 정보(Parse Tree)를 확인하면서 어떤 테이블부터 읽고 어떤 인덱스를 이용해 테이블을 읽을지 선택한다.
◦
불필요한 조건 제거 및 복잡한 연산의 단순화
◦
여러 테이블의 조인이 있는 경우 어떤 순서로 테이블을 읽을지 결정
◦
각 테이블에 사용된 조건과 인덱스 통계 정보를 이용해 사용할 인덱스 결정
◦
가져온 레코드들을 임시 테이블에 넣고 다시 한 번 가공해야 하는지 결정
3.
실행 계획 수행
•
두 번째 단계에서 결정된 테이블의 읽기 순서나 선택된 인덱스를 이용해 스토리지 엔진으로부터 데이터를 가져온다.
◦
MySQL 엔진과 스토리지 엔진이 동시에 참여하여 처리
◦
수립된 실행 계획대로 스토리지 엔진에서 레코드를 읽어오도록 요청
◦
스토리지 엔진으로 부터 받은 레코드를 조인하거나 정렬하는 작업을 수행
옵티마이저의 종류
•
비용 기반 최적화(Cost-based optimizer, CBO)
◦
쿼리를 처리하기 위한 여러 가지 방법을 수립 후 각 단위 작업의 비용 정보와 대상 테이블의 예측된 통계 정보를 통해 실행 계획별 비용을 산출 후 최소 비용 작업으로 실행 계획을 수립하는 방법
◦
현재 대부분의 DBMS가 사용
•
규칙 기반 최적화 방법(Rule-based optimizer, RBO)
◦
대상 테이블의 레코드 건수나 선택도 등을 고려하지 않고 옵티마이저에 내장된 우선순위 만으로 실행 계획을 수립하는 방법
◦
예전 초기 버전 오라클 DBMS에서 주로 사용
◦
사용자의 데이터 분포도가 매우 다양하여 거의 사용하지 않는다.