옵티마이저 스위치: 컨디션 팬아웃

공부하는 감자·2024년 3월 28일
0

MySQL

목록 보기
34/74
post-thumbnail

컨디션 팬아웃

조인의 순서와 성능

  • 조인을 실행할 때 테이블의 순서는 쿼리의 성능에 매우 큰 영향을 미친다.
    • 어떤 테이블이 드라이빙 테이블이 되느냐에 따라 달라진다.
    • 예를 들어, 일치하는 레코드가 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 옵티마이저가 실행 계획을 수립할 때 테이블이나 인덱스의 통계 정보만 사용하는 것이 아니라 다음의 순서대로 사용 가능한 방식을 선택한다.

  1. 레인지 옵티마이저(Range optimizer)를 이용한 예측
  2. 히스토그램을 이용한 예측
  3. 인덱스 통계를 이용한 예측
  4. 추측에 기반한 예측(Guesstimeates)

여기서 가장 우선순위가 높은 레인지 옵티마이저는 실제 인덱스의 데이터를 살펴보고 레코드 건수를 예측하는 방식이다.

  • 실제 쿼리가 실행되기도 전에 실행 계획을 수립 단계에서 빠르게 소량의 데이터를 읽어보는 것이다.
  • 레인지 옵티마이저에 의한 예측은 인덱스를 이용해서 쿼리가 실행될 수 있을 때만 사용된다.
  • 레인지 옵티마이저를 이용한 예측이 우선순위가 높기 때문에 실행 계획에 표시되는 레코드 건수가 테이브이나 인덱스의 통계, 히스토그램 정보와 다른 값이 표시될 수도 있다.

Reference

참고 서적

📔 Real MySQL 8.0

profile
책을 읽거나 강의를 들으며 공부한 내용을 정리합니다. 가끔 개발하는데 있었던 이슈도 올립니다.

0개의 댓글