본문으로 건너뛰기

Optimizer

1 Optimizer

  • MySQL 서버로 요청된 쿼리의 결과는 동일하지만 내부적으로 그 결과를 만들어내는 방법은 매우 다양하다
  • 쿼리를 최적으로 실행하기 위해 각 테이블의 데이터가 어떤 분포로 저장되어 있는지 참조하면 최적의 실행 계획을 수립하는 작업을 Optimizer가 담당한다

1.1 실행계획

  • MySQL에서는 EXPLAIN이라는 명령어로 쿼리의 실행 계획을 확인할 수 있다

2 쿼리 실행 절차

MySQL 서버에서 쿼리가 실행되는 과정은 크게 세 단계

  1. SQL 문장을 쪼개서 MySQL 서버가 이해할 수 있는 수준으로 분리한다
  2. SQL의 파싱 정보를 확인하면서 어떤 테이블을 읽고 어떤 인덱스를 이용해 테이블을 읽을지 선택
  3. 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에서 거의 사용되지 않는다