책너두 6기 33일차

백은빈, 이성욱의 Real MySQL8.0 1권 p.344 ~ p.355

내용정리

09 옵티마이저와 힌트

9.3 고급 최적화

9.3.1 옵티마이저 스위치 옵션

9.3.1.13 구체화(Materialization)

세미 조인에 사용된 서브쿼리를 통째로 구체화해서 쿼리를 최적화한다는 의미. 내부 임시 테이블을 생성한다는 의미이다.

제한 사항과 특성

  • IN에서 서브쿼리는 상관 서브쿼리(Correlated subquery)가 아니어야 한다.
  • 서브쿼리는 GROUP BY나 집합 함수들이 사용돼도 구체화를 사용할 수 있다.
  • 구체화가 사용된 겨웅에는 내부 임시 테이블이 사용된다.
9.3.1.14 중복 제거(Duplicated Weed-out)

세미 조인 서브쿼리를 일반적인 INNER JOIN 쿼리로 바꿔서 실행하고 마지막에 중복된 레코드를 제거하는 방법으로 처리되는 최적화 알고리즘

장점과 제한사항

  • 서브쿼리가 상관 서브쿼리더라도 사용할 수 있다
  • 서브쿼리가 GROUP BY나 집합 함수가 사용된 경우에는 사용할 수 없다
  • 서브쿼리의 테이블을 조인으로 처리하기 때문에 최적화할수 있는 방법이 많다.
9.3.1.15 컨디션 팬아웃(condition_fanout_filter)

조인을 실행할 때 테이블의 순서는 쿼리의 성능에 매우 큰 영향을 미친다. 이 옵션은 옵티마이저가 더 정교한 계산을 거쳐서 실행 계획을 수립하지만 더 많은 시간과 컴퓨팅 자원이 사용된다.

9.3.1.16 파생 테이블 머지(derived_merge)

FROM 절에 사용된 서브쿼리를 파생 테이블(Derived Table)이라고 부른다. 서버는 내부적으로 임시 테이블을 생성하고 레코드를 테이블에서 읽어서 임시 테이블로 INSERT한다. 그리고 다시 임시 테이블을 읽어서 특정 레코드만 걸러내어 반환한다. 파생 테이블로 만들어지는 서브 쿼리를 외부 쿼리와 병합해서 서브쿼리 부분을 제거화하는 최적화를 다루는 옵션이다. 다음 경우는 사용할 수 없으므로 수동으로 병합해야 쿼리의 성능이 향상된다.

  • SUM 또는 MIN, MAX 같은 집계 함수와 윈도우 함수가 사용된 서브쿼리
  • DISTINCT, GROUB BY, HAVING, LIMIT, UNION, UNION ALL이 사용되거나 포함된 서브쿼리
  • select 절에 사용된 서브쿼리
  • 값이 변경되는 사용자 변수가 사용된 서브쿼리
9.3.1.17 인비저블 인덱스(use_invisible_indexes)

인덱스의 가용상태를 제어하는 옵션 인덱스를 삭제하지 않고 해당 인덱스를 사용하지 못하게 제어한다.

9.3.1.18 스킵 스캔(skip_scan)

인덱스의 선행 칼럼이 조건절에 사용되지 않더라도 후행 칼럼의 조건만으로도 인덱스를 이용한 쿼리 성능 개선이 가능하게 해주는 옵션. 원래는 WHERE 절에 있는 조건에 관한 칼럼만 활용할 수 있었다.