책너두 6기 35일차

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

내용정리

09 옵티마이저와 힌트

9.4 쿼리 힌트

옵티마이저에게 쿼리의 실행 계획을 어떻게 수립해야 할지 알려줄 수 있는 방법. 인덱스 힌트와 옵티마이저 힌트 2가지로 구분한다.

9.4.1 인덱스 힌트

SQL의 문법에 맞게 사용해야 해서 ANSI-SQL 표준 문법을 준수하지 못하는 단점이 있다. 따라서 가급적 옵티마이저 힌트를 쓸 것이 권장된다.

9.4.1.1 STRAIGHT_JOIN

옵티마이저 힌트인 동시에 조인 키워드이기도 하다. SELECT, UPDATE, DELETE쿼리에서 여러 개의 테이블이 조인되는 경우 조인 순서를 고정하는 역할을 한다.

다음 순서로 결정되지 않을때만 사용하자.

  • 임시 테이블(인라인 뷰 또는 파생된 테이블)과 일반 테이블의 조인: 이 경우에는 거의 일반적으로 임시 테이블을 드라이빙 테이블로 선정하는 것이 좋다.
  • 임시 테이블끼리 조인 : 항상 인덱스가 없기 때문에 순서는 무관하므로 크기가 작은 테이블을 드라이빙으로 선택해주는 것이 좋다.
  • 일반 테이블끼리 조인 : 양 쪽 모두 조인 칼럼에 인덱스가 있거나 모두 조인 칼럼에 인덱스가 없을 떈 레코드 건수가 적은쪾으로 드라이빙을 선택

JOIN_FIXED_ORDER, JOIN_ORDER, JOIN_PREFIX, JOIN_SUFFIX 가 STRAIGHT_JOIN 힌트와 비슷한 역할을 한다.

9.4.1.2 USE INDEX / FORCE INDEX / IGNORE INDEX

인덱스 힌트는 사용하려는 인덱스를 가지는 테이블 뒤에 힌트를 명시해야 한다.

  • USE INDEX : 가장 자주 사용. 특정 테이블의 인덱스를 사용하도록 권장하는 힌트
  • FORCE INDEX : USE INDEX보다 미치는 영향력이 더 강한 힌트. USE를 써도 사용하지 않을 떈 보통 이것도 먹히지 않음.
  • IGNORE INDEX : 특정 인덱스를 사용하지 못하게 하는 인덱스
9.4.1.3 SQL_CALC_FOUND_ROWS

보통은 LIMIT을 사용하면 조건을 만족하는 레코드가 명시된 수보다 많더라도 LIMIT을 채우면 멈추지만 이 힌트가 포함되면 끝까지 검색을 수행한다.

9.4.2 옵티마이저 힌트

9.4.2.1 옵티마이저 힌트 종류
  • 인덱스 : 특정 인덱스의 이름을 사용할 수 있음
  • 테이블 : 특정 테이블의 이름을 사용할 수 있음
  • 쿼리 블록 : 힌트가 명시된 쿼리리 블록에 대해서만 영향을 미치는 힌트
  • 글로벌 : 전체 쿼리에 대해서 영향을 미치는 힌트