optimizer_switch
시스템 변수를 통해 여러 개의 옵션을 세트로 묶어 설정하는 방식으로 제어할 수 있다.default
, on
, off
중 하나를 선택할 수 있다.-- // MySQL 서버 전체적으로 옵티마이저 스위치 설정
SET GLOBAL optimizer_switch='indexmerge=on, index_merge_union=on,...';
-- // 현재 커넥션의 옵티마이저 스위치만 설정
SET SESSION optimizer_switch='index_merge=on, index_merge_union=on,...';
-- // 현재 쿼리에만 설정
SELECT /*+ SET_VAR(optimizer_switch='condition_fanout_filter=off')*/
...
FROM ...
optimizer_switch=’batched_key_access=on’;
으로 활성화 (기본값은 비활성화)dept_emp.from_date
에는 인덱스가 생성되어 있고 emp_no
는 프라이머리 키다. SELECT *
FROM dept_emp de, employees e
WHERE de.from_date>'1995-01-01' AND e.emp_no<109004;
|--|-----------|-----|-----|-----------|-------------------------------------|
|id|select_type|table|type |key |Extra |
|--|-----------|-----|-----|-----------|-------------------------------------|
|1 |SIMPLE |de |range|ix_fromdate|Using index condition |
|1 |SIMPLE |e |range|PRIMARY |Using join buffer (block nested loop)|
|--|-----------|-----|-----|-----------|-------------------------------------|
dept_emp
가 드라이빙 테이블, employees
가 드리븐 테이블로 쓰였으며 employees
를 조인할 때 조인 버퍼를 통해 블록 네스티드 루프 조인을 한다는 것을 확인할 수 있다.
dept_emp
테이블에서 인덱스를 이용해 from_date>’1995-01-01’
인 레코드를 검색dept_emp
의 나머지 칼럼을 모두 조인 버퍼에 저장employees
테이블 프라이머리 키로 emp_no<109004
인 레코드 검색employees
테이블 결과에서 조인 버퍼에 캐시된 dept_emp
결과를 조인하기 때문에 조인 순서가 거꾸로인 것처럼 실행된다.MySQL 8.0.18부터 해시 조인 알고리즘에 도입되어 8.0.20 버전부터는 블록 네스티드 루프 조인이 더 이상 사용되지 않고 해시 조인 알고리즘이 대체되어 사용된다.