Home
🍎

09-1. 개요

Tags
챕터 내용 정리

9.0.0.

Mysql 서버로 요청된 쿼리는 결과는 동일하더라도 내부적으로 결과를 만들어내는 방법은 매우 다양함
⇒ 따라서 어떤 방법이 최적이고 최소의 비용이 소모되는지 경로를 설정해야 함
쿼리를 최적으로 실행하기 위해 각 테이블의 데이터가 어떤 분포로 저장되어있는지 통계 정보를 참고
& 기본 데이터를 비교해서 최적의 실행 계획을 수립하는 작업 필요
⇒ 옵티마이저의 담당
MySQL ⇒ EXPLAIN 명령어로 쿼리의 실행 계획을 알 수 있음

9.1.1. 쿼리 실행 절차

1. SQL 파싱(Parsing): 사용자로부터 요청된 SQL 문장을 잘게 쪼개서 MySQL 서버가 이해할 수 있는 수준으로 분리(Parse Tree) - 문법적으로 잘못된 부분을 거름 => SQL 파스 트리: MySQL 서버는 SQL 파스 트리를 이용해 쿼리를 실행 2. 최적화 및 실행 계획 수립: SQL의 파싱 정보(Parse Tree)를 확인하면서 어떤 테이블에서 어떤 인덱스를 이용해 읽을지 선택 - 불필요한 조건 제거 및 복잡한 연산의 단순화 - 여러 테이블의 조인이 있는 경우 어떤 순서로 테이블을 읽을지 결정 - 각 테이블에 사용된 조건과 인덱스 통계 정보를 이용해 사용할 인덱스를 결정 - 가져온 레코드들을 임시 테이블에 넣고 다시 한 번 가공해야 하는지 결정 => 쿼리의 '실행 계획' 3: 2단계에서 결정된 테이블의 읽기 순서나 선택된 인덱스를 이용해 스토리지 엔진으로부터 데이터를 가져옴 - 수립된 실행 계획대로 스토리지 엔진에 레코드를 읽어오도록 요청 - MySQL 엔진은 스토리지 엔진으로부터 받은 레코드를 조인하거나 정렬
Plain Text
복사
1단계 및 2단계는 거의 MySQL 엔진에서 처리
3단계는 MySQL 엔진 + 스토리지 엔진 동시 참여

9.1.2 옵티마이저 종류

옵티마이저는 데이터베이스 서버에서 두뇌 역할
종류
비용 기반 최적화(Cost-based optimizer, CBO)
현재 대부분의 DBMS가 선택
쿼리를 처리하기 위한 여러가지 가능한 방법을 만듬 → 각 단위 작업의 비용(부하) 정보와 대상 테이블의 예측된 통계를 이용해 실행 계획별 비용 산출
산출된 실행 방법별로 비용이 최소로 소요되는 처리 방식을 선택해 최종적으로 쿼리 실행
규칙 기반 최적화(Rule-based optimizer, RBO)
초기 버전의 오라클 DBMS에서 사용
옵티마이저에 내장된 우선순위에 따라 실행 계획을 수립 (대상 테이블의 레코드 건수/선택도 등을 고려하지 않음 = 통계 정보를 조사하지 않고 실행 계획을 수립)
같은 쿼리에 대해서는 거의 항상 같은 실행 방법을 만들어냄
각 테이블이나 인덱스의 통계 정보가 거의 없음 + 상대적으로 CPU 연산이 느림의 이유로 사용되었던 최적화 방법임