CH 6 실행계획(6.1, 6.2)
6.1 개요
6.1.1 쿼리 실행 절차
Mysql 서버에서 쿼리가 실행되는 과정은 크게 3가지로 나눌 수 있다.
- 사용자로부터 요청된 sql 문장을 잘게 쪼개서 Mysql 서버가 이해할 수 있는 수준으로 분리한다.
- sql의 파싱 정보를 확인하면서 어떤 테이블부터 읽고 어떤 인덱스를 이용해 테이블을 읽을지 선택한다.
- 두 번째 단계에서 결정된 테이블의 읽기 순서나 선택된 인덱스를 이용해 스토리지 엔진으로 부터 데이터를 가져온다.
첫번째 단계를 sql 파싱 이라고 하며, Mysql 서버의 sql 파서 라는 모듈로 처리한다. 만약 문법이 잘못되었다면 이 단계에서 걸러진다. 또한 이 단계에서 sql 파스 트리 가 만들어진다.
두번째 단계는 sql 파스 트리 를 참조하면서 다음과 같은 내용을 처리한다.
- 불필요한 조건의 제거 및 복잡한 연산의 단순화
- 여러 테이블의 조인이 있는 경우 어떤 순서로 테이블을 읽을지 결정
- 각 테이블에 사용된 조건과 인덱스 통계 정보를 이용해 사용할 인덱스 결정
- 가져온 레코드들을 임시 테이블에 넣고 다시 한번 가공해야 하는지 결정
두번째 단계에서는 최적화 및 실행 계획 수립 단계이며 Mysql 서버의 옵티마이저 에서 처리한다.
6.1.2 옵티마이저의 종류
옵티마이저는 데이터베이스 서버에서 두뇌와 같은 역할을 담당하고 있다. 옵티마이저는 비용 기반 최적화(Cost-based optimizer, CBO)방법과 규칙 기반 최적화 방법(Rule-based optimizer, RBO)으로 크게 나눠 볼 수 있다.
- 규칙 기반 최적화는 옵티마이저에 내장된 우선순위에 따라 실행 계획을 수립하는 방식을 의미한다. 현재 들어와 있는 데이터들의 통계정보를 사용하지 않기 때문에 상황에 따른 효율성이 다르다.
- 비용 기반 최적화는 쿼리를 처리하기 위한 여러가지 방법을 만들고, 각 단위 작업의 비용 정보와 대상 테이블의 예측된 통계정보를 이용해 각 실행 계획별 비용을 산출한다. 이렇게 산출된 각 실행 방법별로 최소 비용이 소요되는 처리 방식을 선택해 최종 쿼리를 실행한다.
6.1.3 통계 정보
현재 대부분의 RDBMS는 비용 기반의 옵티마이저를 선택하고 있다. 비용 기반 최적화에서 가장 중요한 것은 통계정보다. 통계 정보가 정확하지 않다면 전혀 엉뚱한 방향으로 쿼리를 실행해 버릴 수 있기 때문이다. Mysql에서 관리되는 통계 정보는 대략의 레코드 건수와 인덱스의 유니크한 값의 개수 정보가 전부다. Mysql통계 정보는 순간순간 자동으로 변경되지만 ANALYZE를 통해 강제적으로 갱신할 수 있다.