STRAIGHT_JOIN
과 같은 힌트들도 있다.USE INDEX
, STRAIGHT_JOIN
등인덱스 힌트의 종류는 다음과 같다.
옵티마이저 힌트는 영향 범위에 따라 다음 4개 그룹으로 나눌 수 있다. 이 구분으로 인해 힌트의 사용 위치가 달라지는 것은 아니다.
SELECT /*+ INDEX(테이블명 인덱스명)*/
QB_NAME()
힌트를 이용해 해당 쿼리 블록에 이름을 부여하면 외부 쿼리 블록에서 사용할 수 있다.힌트 이름 | 설명 | 영향 범위 |
---|---|---|
MAX_EXECUTION_TIME | 쿼리의 실행 시간 제한 | 글로벌 |
RESOURCE_GROUP | 쿼리 실행의 리소스 그룹 설정 | 글로벌 |
SET_VAR | 쿼리 실행을 위한 시스템 변수 제어 | 글로벌 |
SUBQUERY | 서브쿼리의 세미 조인 최적화(MATERIALIZATION과 INTOEXISTS) 전략 제어 | 쿼리 블록 |
BKA, NO_BKA | BKA(Batched Key Access) 조인 사용 여부제어 | 쿼리 블록, 테이블 |
BNL, NO_BNL | MySQL 8.0.18 이전: 블록 네스티드 루프 조인 사용 여부 제어 MySQL 8.0.20 부터: 해시 조인 사용 여부 제어 | 쿼리 블록, 테이블 |
DERIVED_CONDITION_PUSHDOWN, NO_DERIVED_CONDITION_PUSHDOWN | 외부 쿼리의 조건을 서브 쿼리로 옮기는 최적화 사용 여부 제어 | 쿼리 블록, 테이블 |
HASH_JOIN, NO_HASH_JOIN | 해시 조인 사용 여부 제어 MySQL 8.0.18 버전에서만 사용 가능하다. | 쿼리 블록, 테이블 |
JOIN_FIXED_ORDER | FROM 절에 명시된 테이블 순서대로 조인 실행 | 쿼리 블록 |
JOIN_ORDER | 힌트에 명시된 테이블 순서대로 조인 실행 | 쿼리 블록 |
JOIN_PREFIX | 힌트에 명시된 테이블을 조인의 드라이빙 테이블로 조인 실행 | 쿼리 블록 |
JOIN_SUFFIX | 힌트에 명시된 테이블을 조인의 드리븐 테이블로 조인 실행 | 쿼리 블록 |
QB_NAME | 쿼리 블록의 이름 설정을 위한 힌트 | 쿼리 블록 |
SEMIJOIN, NO_SEMIJOIN | 서브쿼리의 세미 조인 최적화(DUPSWEEDOUT, FIRSTMATCH, LOOSESCAN, MATERIALIZATION) 전략 제어 | 쿼리 블록 |
MERGE, NO_MERGE | FROM 절의 서브쿼리나 뷰를 외부 쿼리 블록으로 병합하는 최적화를 수행할지 여부 제어 | 테이블 |
INDEX_MERGE, NO_INDEX_MERGE | 인덱스 병합 실행 계획 사용 여부 제어 | 테이블, 인덱스 |
MRR, NO_MRR | MRR(Multi-Range Read) 사용 여부 제어 | 테이블, 인덱스 |
NO_ICP | ICP(인덱스 컨디션 푸시다운) 최적화 전략 사용 여부 지어 | 테이블, 인덱스 |
NO_RANGE_OPTIMIZATION | 인덱스 레인지 액세스를 비활성화 (특정 인덱스를 사용하지 못하도록 하거나, 쿼리를 풀 테이블 스캔 방식으로 처리) | 테이블, 인덱스 |
SKIP_SCAN, NO_SKIP_SCAN | 인덱스 스킵 스캔 사용 여부 제어 | 테이블, 인덱스 |
INDEX, NO_INDEX | GROUP BY, ORDER BY, WHERE 절의 처리를 위한 인덱스 사용 여부 제어 | 인덱스 |
GROUP_INDEX, NO_GROUP_INDEX | GROUP BY 절의 처리를 위한 인덱스 사용 여부 제어 | 인덱스 |
JOIN_INDEX, NO_JOIN_INDEX | WHERE 절의 처리를 위한 인덱스 사용 여부 제어 | 인덱스 |
ORDER_INDEX, NO_ORDER_INDEX | ORDER BY 절의 처리를 위한 인덱스 사용 여부 제어 | 인덱스 |