컨디션 팬아웃
조인의 순서와 성능
- 조인을 실행할 때 테이블의 순서는 쿼리의 성능에 매우 큰 영향을 미친다.
- 어떤 테이블이 드라이빙 테이블이 되느냐에 따라 달라진다.
- 예를 들어, 일치하는 레코드가 1만 건인 A테이블과 레코드가 10건인 B테이블을 조인할 때, A 테이블이 드라이빙 테이블이 되면 B테이블의 인덱스를 이용해 조인을 실행하더라도 B테이블을 1만 번 읽어야 한다(B테이블의 인덱스를 구성하는 B-Tree의 루트 노드부터 검색 실행).
- MySQL 옵티마이저는 여러 테이블이 조인되는 경우 가능하다면 일치하는 레코드 건수가 적은 순서대로 조인을 실행한다.
Condition Fanout Filter
conditon_fanout_filter
최적화가 활성화되면 다음과 같은 조건을 만족하는 칼럼의 조건들에 대해 조건을 만족하는 레코드의 비율을 계산할 수 있다.
- WHERE 조건절에 사용된 칼럼에 대해 인덱스가 있는 경우
- WHERE 조건절에 사용된 칼럼에 대해 히스토그램이 존재하는 경우
conditon_fanout_filter
최적화가 활성화되면 MySQL 옵티마이저는 더 정교한 계산을 거쳐서 실행 계획을 수립한다.
- 그에 따라 쿼리의 실행 계획 수립에 더 많은 시간과 컴퓨팅 자원을 사용하게 된다.
- MySQL 서버가 처리하는 쿼리의 빈도가 매우 높다면 실행 계획 수립에 추가되는 오버헤드가 더 크게 보일 수 있으므로 가능하면 업그레이드를 실행하기 전에 성능 테스트를 진행하는 것이 좋다.
- MySQL 8.0 이전 버전에서도 쿼리 실행 계획이 잘못된 선택을 한 적이 별로 없다면
conditon_fanout_filter
최적화가 성능 향상에 크게 도움이 되지 않을 수도 있다.
레인지 옵티마이저
MySQL 옵티마이저가 실행 계획을 수립할 때 테이블이나 인덱스의 통계 정보만 사용하는 것이 아니라 다음의 순서대로 사용 가능한 방식을 선택한다.
- 레인지 옵티마이저(Range optimizer)를 이용한 예측
- 히스토그램을 이용한 예측
- 인덱스 통계를 이용한 예측
- 추측에 기반한 예측(Guesstimeates)
여기서 가장 우선순위가 높은 레인지 옵티마이저는 실제 인덱스의 데이터를 살펴보고 레코드 건수를 예측하는 방식이다.
- 실제 쿼리가 실행되기도 전에 실행 계획을 수립 단계에서 빠르게 소량의 데이터를 읽어보는 것이다.
- 레인지 옵티마이저에 의한 예측은 인덱스를 이용해서 쿼리가 실행될 수 있을 때만 사용된다.
- 레인지 옵티마이저를 이용한 예측이 우선순위가 높기 때문에 실행 계획에 표시되는 레코드 건수가 테이브이나 인덱스의 통계, 히스토그램 정보와 다른 값이 표시될 수도 있다.
Reference
참고 서적
📔 Real MySQL 8.0