9.1 개요
9.1.1 쿼리 실행 절차
SQL 분리(파스 트리 생성)
→ 파스 트리를 통해 어떤 테이블을 어떤 인덱스로 읽을 지 결정
→ 스토리지 엔진으로부터 데이터를 가져옴
- 파스 트리 생성에서 문법 문제 걸러짐
- SQL 파스 트리를 통해 아래 내용 처리
- 불필요한 조건 제거, 연산 단순화
- 조인이 있는 경우 어떤 순서로 읽을지 결정
- 조건과 인덱스 통계 정보를 이용해 사용할 인덱스 결정
- 가져온 레코드를 임시 테이블에 넣고 재가공이 필요한지 결정
9.1.2 옵티마이저의 종류
옵티마이저 → 데이터베이스 서버의 두뇌
- 비용 기반 최적화(CBO): 여러 가능한 방법을 만들고, 각 단위 작업 비용 정보, 테이블 별 예측된 통계정보를 통해 실행 계획별 비용 산출 → 최소 비용 방식 선택하고 쿼리 실행
- 규칙 기반 최적화(RBO): 옵티마이저에 내장된 우선순위에 따라 실행 계획을 수립 → 같은 쿼리면 거의 같은 실행 방법을 만들어냄, 사용자 데이터는 분포도가 다양하므로 요즘은 잘 사용하지 않음
9.2 기본 데이터 처리
9.2.1 풀 테이블 스캔과 풀 인덱스 스캔
풀 테이블 스캔을 선택하는 경우:
- 테이블 레코드 건수가 너무 작음(일반적으로 테이블이 페이지 1개일때)
- WHERE절이나 ON 절에 인덱스를 이용할 수 있는 적절한 조건이 없음
- 인덱스 레인지를 사용할 수 있어도, 통계 정보 기준 옵티마이저가 판단한 조건 일치 레코드 건수가 너무 많을때
InnoDB 스토리지 엔진은 특정 테이블의 연속된 데이터 페이지가 읽히면, 백그라운드 스레드에 의해 리드 어헤드(어떤 영역의 데이터가 앞으로 필요해지리라는 것을 예측하고 미리 InnoDB 버퍼 풀에 가져다 두는 것) 작업이 자동으로 시작
풀 인덱스 스캔도 마찬가지로 리드 어헤드 동작
9.2.2 병렬 처리
하나의 쿼리를 병렬로 처리하는걸 말함 → 8.0부터