책너두 6기 32일차
백은빈, 이성욱의 Real MySQL8.0 1권 p.329 ~ p.343
내용정리
09 옵티마이저와 힌트
9.3 고급 최적화
9.3.1 옵티마이저 스위치 옵션
9.3.1.5 인덱스 머지(index_merge)
인덱스를 이용해 쿼리를 실행할 경우 테이블별로 하나의 인덱스만 사용하지 않고 2개 이상의 인덱스를 이용해 쿼리를 처리하는 옵션
9.3.1.6 인덱스 머지 -교집합(index_merge_intersection)
쿼리가 2개의 where
조건을 가질 때 각각의 인덱스 키를 모두 사용하여 쿼리를 처리하는 것. 결과를 교집합만 반환한다.
9.3.1.7 인덱스 머지-합집합(index_merge_union)
교집합과 달리 OR
연산자를 사용하는 것. 합집합을 반환한다. 우선순위 큐를 이용하여 중복된 레코드들을 정렬 없이 걸러낸다.
9.3.1.8 인덱스 머지 - 정렬 후 합집합(index_merge_sort_union)
위에서는 별도의 정렬 없이 합집합을 구하였지만, 인덱스 머지 작업 중 결과의 정렬이 필요할 떄는 이 방법을 사용한다.
9.3.1.9 세미 조인(semijoin)
실제 조인을 수행하지는 않고, 단지 다른 테이블에서 조건에 일치하는 레코드가 있는지 없는지만 체크하는 형태의 쿼리(Semi-join)
최적화 방법
- 세미 조인 형태(=,IN)
- 세미 조인 최적화
- IN-to-EXISTS 최적화
- MATERIALIZATION 최적화
- 안티 세미 조인 쿼리 형태(<>, NOT IN)
- IN-to-EXISTS
- MATHERIALIZATION 최적화
- 세미 조인 최적화(최근)
- Table Pull-out
- Duplicate Weed-out
- First Match
- Loose Scan
- Materialization
9.3.1.10 테이블 풀-아웃(Table Pull-out)
세미 조인의 서브쿼리에 사용된 테이블을 아우터 쿼리로 끄집어낸 후에 쿼리를 조인 쿼리로 재작성하는 형태의 최적화
- 세미 조인 서브쿼리에서만 사용 가능하다.
- 서브쿼리 부분이 UNIQUE 인덱스나 프라이머리 키 룩업으로 결과가 1건인 경우에만 사용 가능하다
- 적용되도 기존 쿼리에서 최적화 방법이 사용 불가능한 것이 아니다.
- 서브쿼리의 모든 테이블이 아우터 쿼리로 끄집어 낼 수 있다면 서브쿼리 자체는 없어진다.
- 서브쿼리를 조인으로 풀어서 사용할 필요가 없다.
9.3.1.11 퍼스트 매치(firstmatch)
IN 형태의 세미 조인을 EXISTS 형태로 튜닝한 것과 비슷한 방법으로 실행된다.
장점
- 가끔은 여러 테이블이 조인되는 경우 원래 쿼리에는 없던 동등 조건을 옵티마이저가 자동으로 추가하는 형태의 최적화가 실행되기도 한다.
- 모든 테이블에 대해 Firstmatch로 최적화를 수행할지 아니면 일부 테이블에 대해서만 수행할지 취사선택할 수 있다.
제한 사항
- 서브쿼리에서 하나의 레코드만 검색되면 멈추는 단축 실행 경로(Short-cut path)라서 서브쿼리는 그 서브쿼리가 참조하는 모든 아우터 테이블이 먼저 조회된 이후에 실행된다.
- 실행 계획의 Extra 칼럼에는 “FirstMatch(table-N)”문구가 표시
- 상관 서브쿼리(Correlated subquery)에서도 사용될 수 있다.
- GROUP BY나 집합 함수가 사용된 서브쿼리의 최적화에는 사용될 수 없다.
9.3.1.12 루스 스캔(loosescan)
루스 인덱스 스캔과 비슷한 읽기 방식을 사용한다.
특성
- 루스 인덱스 스캔으로 서브쿼리 테이블을 읽고, 그다음으로 아우터 테이블을 드리븐으로 사용해서 조인을 수행하기 떄문에 서브쿼리 부분이 루스 인덱스 스캔을 사용할 수 있어야 된다.