•
쿼리의 실행 계획을 수립하는 옵티마이저는 가장 복잡한 부분으로 이해하는 것도 어려우나 실행 계획을 이해할 수 있어야 응용할 수 있으니 잘 공부해두는 것이 좋다.
1. 쿼리 실행 절차
•
쿼리가 실행되는 과정
1.
사용자로부터 요청된 SQL 문장을 잘게 쪼개서 MySQL 서버가 이해할 수 있는 수준으로 분리한다.
•
이 단계를 SQL 파싱이라고 하며 MySQL 서버의 SQL 파서가 처리한다.
•
SQL 문장이 문법적으로 잘못됐을 경우, 해당 단계에서 걸러지며 이 단계에서 파스 트리가 만들어진다.
•
MySQL 서버는 SQL 문장 그 자체가 아닌 파스트리를 이용해 쿼리를 실행한다.
2.
SQL의 파싱 정보를 확인하면서 어떤 테이블부터 읽고 어떤 인덱스를 이용해 테이블을 읽을지 선택한다.
•
첫 번째 단계에서 만들어진 SQL 파스 트리를 참조하면서 다음 내용을 처리, 최적화 및 실행 계획 수립의 단계로 옵티마이저가 처리한다.
◦
불필요한 조건 제거 및 복잡한 연산의 단순화
◦
여러 테이블의 조인이 있는 경우 어떤 순서로 테이블을 읽을지 결정
◦
각 테이블에 사용된 조건과 인덱스 통계 정보를 이용해 사용할 인덱스를 결정
◦
가져온 레코드들을 임시 테이블에 넣고 다시 한번 가공해야하는 지 결정
3.
두 번째 단계에서 결정된 테이블의 읽기 순서나 선택된 인덱스를 이용해 스토리지 엔진으로부터 데이터를 가져온다.
•
MySQL 엔진과 스토리지 엔진이 동시에 참여해서 처리한다.
2. 옵티마이저의 종류
•
옵티마이저는 데이터베이스 서버에서 두뇌와 같은 역할을 담당, 현재 대부분의 DBMS가 채택하고 있는 비용 기반 최적화 방법과 초기 버전 오라클에서 사용했던 규칙 기반 최적화 방법으로 나눌 수 있다.
◦
규칙 기반 최적화
▪
기본적으로 대상 테이블의 레코드 건수나 선택도 등을 고려하지 않고 옵티마이저에 내장된 우선순위에 따라 실행계획을 수립한다.
▪
테이블의 레코드 건수나 칼럼값의 분포도를 조사하지 않고 실행 계획이 수립되기 때문에 같은 쿼리에 대해서는 거의 비슷한 실행 방법을 만들어 낸다.
▪
지금은 데이터 분포도를 고려하는 것이 추세로 잘 사용하지 않는다.
◦
비용 기반 최적화
▪
쿼리를 최적화하기 위해 여러 가지 방법을 만들어둔 후, 각 단위 작업의 비용 정보와 대상 테이블의 예측된 레코드 건수, 칼럼값의 분포도 등을 이용해 실행 계획별 비용을 산출한다.
▪
이렇게 실행 방법별로 비용이 최소로 소요되는 처리 방식을 선택하여 쿼리를 실행한다.
•
규칙 기반 최적화는 각 테이블이나 인덱스의 통계 정보가 거의 없고 상대적으로 느린 CPU 연산 탓에 비용 계싼 과정이 부담스러우므로 사용되던 방법이다.