책너두 6기 36일차

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

내용정리

09 옵티마이저와 힌트

9.4 쿼리 힌트

9.4.2 옵티마이저 힌트

9.4.2.2 MAX_EXCUTION_TIME

유일하게 쿼리의 실행 계획에 영향을 미치지 않는 힌트. 단순히 쿼리의 최대 실행 시간을 설정하는 힌트

9.4.2.3 SET_VAR

시스템 변수를 조정한다. 실행계획을 바꾸거나, 조인 버퍼나 정렬용 버퍼(소트 버퍼)의 크기를 일시적으로 증가시켜 대용량 처리 쿼리의 성능을 향상시키는 용도로 사용.

9.4.2.4 SEMIJOIN & NO_SEMIJOIN

앞에서 살펴본 각 세미 조인의 최적화를 사용할 지 선택은 SEMIJOIN 힌트로 제어할 수 있다.

  • Duplicate weed-out : SEMOJOIN(DUPSWEEDOUT)
  • First Match : SEMIJOIN(FIRSTMATCH)
  • Loose Scan : SEMIJOIN(LOOSESCAN)
  • Materialization : SEMIJOIN(MATERIALIZATION)
  • Table Pull-out : 없음

Table Pul-out 최적화 전략은 사용할 수 있다면 항상 더 나은 성능을 보장하기 때문에 별도로 힌트를 사용할 수 없다.

9.4.2.5 SUBQUERY

서브쿼리 최적화는 세미 조인 최적화가 사용되지 못할 때 사용하는 최적화 방법이다.

  • IN-to-EXISTS : SUBQUERY(INTOEXISTS)
  • Materialization : SUBQUERY(MATERIALIZATION)
9.4.2.6 BNL & NO_BNL & HASHJOIN & NO_HASHJOIN

BNL 힌트를 사용하면 해시 조인을 사용하도록 유도하는 힌트. HASHJOIN은 8.0.20 버전 이후로는 효력이 없다.

9.4.2.7 JOIN_FIXED_ORDER & JOIN_ORDER & JOIN_PREFIX & JOIN_SUFFIX

STRAIGHT_JOIN 힌트는 우선 쿼리의 FROM 절에 사용된 테이블의 순서를 조인 순서에 맞게 변경해야 하는 번거로움이 있다.

  • JOJN_FIXED_ORDER: STRAIGHT_JOIN 힌트와 동일하게 FROM 절의 테이블 순서대로 조인을 실행
  • JOIN_ORDER: FROM 절에 사용된 테이블의 순서가 아니라 힌트에 명시된 순서대로 조인을 실행
  • JOIN_PREFIX : 조인에서 드라이빙 테이블만 강제
  • JOIN_SUFFIX: 조인에서 드리븐 테이블(가장 마지막에 조인돼야할 테이블들)만 강제
9.4.2.8 MERGE & NO_MERGE

FROM절에 사용된 서브쿼리를 항상 내부 임시 테이블인 파생 테이블(Derived table)로 생성할 지, 외부 쿼리와 병합할지를 선택하는 힌트

9.4.2.9 INDEX_MERGE & NO_INDEX_MERGE

하나의 테이블에 대해 여러 개의 인덱스를 동시에 사용하는 것을 인덱스 머지(INDEX MERGE)라고 한다. 이를 제어하는데 사용하는 힌트

9.4.2.10 NO_ICO

인덱스 컨디션 푸시다운(ICP, Index Condition Pushdown) 최적화는 사용 가능하다면 최대한 사용한다. 항상 성능 향상에 도움이 되기 때문이다. 하지만 이로 인해 여러 실행 계획의 비용 계산이 잘못된다면 문제가 될 수 있다. 이 힌트로 비활성화하여 유연하고 정화갛게 실행 계획을 선택할 수 있다.

9.4.2.11 SKIP_SCAN & NO_SKIP_SCAN

인덱스 스킵 스캔은 인덱스의 선행 칼럼에 대해 조건이 없어도 옵티마이저가 해당 인덱스를 사용할 수 있게 해주는 매우 훌륭한 최적화 기능이다. 조건이 누락된 선행 칼럼이 가지는 유니크한 값의 개수가 많아지면 성능은 오히려 떨어지는데, 이 힌트로 인덱스 스킵 스캔을 선택하지 않게 할 수 있다.

9.4.2.12 INDEX & NO_INDEX

예전 MySQL 서버에서 사용되던 인덱스 힌트를 대신하는 용도

인덱스 힌트 옵티마이저 힌트
USE INDEX INDEX
USE INDEX FOR GROUP BY GROUP_INDEX
USE INDEX FOR ORDER BY ORDER_INDEX
IGNORE INDEX NO_INDEX
IGNORE INDEX FOR GROUP BY NO_GROUP_INDEX
IGNORE INDEX FOR ORDER BY NO_ORDER_INDEX