Search
Duplicate
1️⃣

개요

쿼리의 실행 계획을 수립하는 옵티마이저는 가장 복잡한 부분으로 이해하는 것도 어려우나 실행 계획을 이해할 수 있어야 응용할 수 있으니 잘 공부해두는 것이 좋다.

1. 쿼리 실행 절차

쿼리가 실행되는 과정
1.
사용자로부터 요청된 SQL 문장을 잘게 쪼개서 MySQL 서버가 이해할 수 있는 수준으로 분리한다.
이 단계를 SQL 파싱이라고 하며 MySQL 서버의 SQL 파서가 처리한다.
SQL 문장이 문법적으로 잘못됐을 경우, 해당 단계에서 걸러지며 이 단계에서 파스 트리가 만들어진다.
MySQL 서버는 SQL 문장 그 자체가 아닌 파스트리를 이용해 쿼리를 실행한다.
2.
SQL의 파싱 정보를 확인하면서 어떤 테이블부터 읽고 어떤 인덱스를 이용해 테이블을 읽을지 선택한다.
첫 번째 단계에서 만들어진 SQL 파스 트리를 참조하면서 다음 내용을 처리, 최적화 및 실행 계획 수립의 단계로 옵티마이저가 처리한다.
불필요한 조건 제거 및 복잡한 연산의 단순화
여러 테이블의 조인이 있는 경우 어떤 순서로 테이블을 읽을지 결정
각 테이블에 사용된 조건과 인덱스 통계 정보를 이용해 사용할 인덱스를 결정
가져온 레코드들을 임시 테이블에 넣고 다시 한번 가공해야하는 지 결정
3.
두 번째 단계에서 결정된 테이블의 읽기 순서나 선택된 인덱스를 이용해 스토리지 엔진으로부터 데이터를 가져온다.
MySQL 엔진과 스토리지 엔진이 동시에 참여해서 처리한다.

2. 옵티마이저의 종류

옵티마이저는 데이터베이스 서버에서 두뇌와 같은 역할을 담당, 현재 대부분의 DBMS가 채택하고 있는 비용 기반 최적화 방법과 초기 버전 오라클에서 사용했던 규칙 기반 최적화 방법으로 나눌 수 있다.
규칙 기반 최적화
기본적으로 대상 테이블의 레코드 건수나 선택도 등을 고려하지 않고 옵티마이저에 내장된 우선순위에 따라 실행계획을 수립한다.
테이블의 레코드 건수나 칼럼값의 분포도를 조사하지 않고 실행 계획이 수립되기 때문에 같은 쿼리에 대해서는 거의 비슷한 실행 방법을 만들어 낸다.
지금은 데이터 분포도를 고려하는 것이 추세로 잘 사용하지 않는다.
비용 기반 최적화
쿼리를 최적화하기 위해 여러 가지 방법을 만들어둔 후, 각 단위 작업의 비용 정보와 대상 테이블의 예측된 레코드 건수, 칼럼값의 분포도 등을 이용해 실행 계획별 비용을 산출한다.
이렇게 실행 방법별로 비용이 최소로 소요되는 처리 방식을 선택하여 쿼리를 실행한다.
규칙 기반 최적화는 각 테이블이나 인덱스의 통계 정보가 거의 없고 상대적으로 느린 CPU 연산 탓에 비용 계싼 과정이 부담스러우므로 사용되던 방법이다.