옵티마이저 스위치: 세미 조인

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

MySQL

목록 보기
32/74
post-thumbnail

세미 조인

세미 조인이 도입되기 전

  • MySQL 5.7 서버는 전통적으로 세미 조인 형태의 쿼리를 최적화하는 부분이 상당히 취약했다.
  • 예전 처리 방식을 확인해보고 싶다면 세미 조인 최적화를 off로 변경하면 된다.
    -- 세미 조인 비활성화
    SET SESSION optimizer_switch='semijoin=off';
    
    -- 테스트 후, 반드시 기본값으로 되돌려두어야 한다.
    SET optimizer_switch='default';
  • 다음 쿼리는 employees 테이블을 풀 스캔하면서 한 건 한 건 서브쿼리의 조건에 일치하는지 비교한다.
    SELECT *
    FROM employees e
    WHERE e.emp_no IN (
    		SELECT de.emp_no FROM dept_emp de WHERE de.from_date='1995-01-01';
    	)

Semi-Join

  • 다른 테이블과 실제 조인을 수행하지 않고, 단지 다른 테이블에서 조건에 일치하는 레코드가 있는지 없는지만 체크하는 형태의 쿼리를 말한다.
  • 세미 조인 형태의 쿼리와 안티 세미 조인(Anti Semi-Join) 형태의 쿼리는 최적화 방법이 조금 차이가 있다.

세미 조인 쿼리 최적화 방법

  • = (subquery)IN (subquery) 형태의 쿼리
  • 세미 조인 최적화
  • IN-to-EXISTS 최적화
  • MATERIALIZATION 최적화

안티 세미 조인 쿼리 최적화 방법

  • <> (subquery)NOT IN (subquery) 형태의 쿼리
  • IN-to-EXISTS 최적화
  • MATERIALIZATION 최적화

세미 조인 최적화

세미 조인 최적화의 상세한 내용은 다음장부터 정리한다.

  • MySQL 서버 8.0 버전부터는 세미 조인 쿼리의 성능을 개선하기 위한 다음과 같은 최적화 전략이 있다.
    • Table Pull-out
    • Duplicate Weed-out
    • First Match
    • Loose Scan
    • Materialization
    • MySQL 서버 매뉴얼에서는 이 최적화 전략들을 모아서 세미 조인 최적화라고 부른다.
  • MySQL 옵티마이저는 쿼리에 사용되는 테이블과 조인 조건의 특성에 따라 사용 가능한 전략들을 선별적으로 사용한다.
    • Table Pull-out 최적화 전략은 사용 가능하면 항상 세미 조인보다는 좋은 성능을 내기 때문에 별도로 제어하는 옵티마이저 옵션을 제공하지 않는다.
    • First Match 최적화 전략은 firstmatch 옵티마이저 옵션으로 사용 여부를 결정할 수 있다.
    • Loose Scan 최적화 전략은 loosescan 옵티마이저 옵션으로 사용 여부를 결정할 수 있다.
    • Duplicate Weed-out과 Materialization 최적화 전략은 meterialization 옵티마이저 스위치로 사용 여부를 선택할 수 있다.
  • optimizer_switch 시스템 변수의 semijoin 옵티마이저 옵션은 firstmatch와 loosescan, materialization 옵티마이저 옵션을 한 번에 활성화하거나 비활성화할 때 사용한다.

Reference

참고 서적

📔 Real MySQL 8.0

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

0개의 댓글