-
MySQL Hint (옵티마이저 힌트 & 인데스 힌트)CS 지식/데이터베이스 2022. 7. 29. 15:47반응형
Hint
- 조인이나 인덱스 실행 계획을 개발자가 옵티마이저에 힌트를 주어 바꿀 수 있는 것이 힌트
옵티마이저 힌트
와인덱스 힌트
두 종류로 나뉜다.
옵티마이저 힌트
- optimizer_switch 시스템 변수를 설정하여 제어 가능
- 후속 쿼리에 대한 영향을 주기 때문에 mysql에 대한 이해도가 깊지 않다면 지양해야한다.
- 명령문 내의 옵티마이저 힌트
- optimizer_switch 보다 선행되며 다양한 범위 수준에서 적용된다.
- 전역
- 전체 문에 영향
- 쿼리 블록
- 명령문 내의 특정 쿼리 블록에만 영향
- 테이블
- 쿼리 블록 내의 특정 테이블에만 영향
- 인덱스
- 테이블 내의 특정 인덱스에만 영향
- 전역
- optimizer_switch 보다 선행되며 다양한 범위 수준에서 적용된다.
- 주석 내에 지정해서 사용하며 SEMIJOIN, BKA 등이 있다. (상세한 것은 나중에 옵티마이저 힌트가 필요해지면 추가 정리)
인덱스 힌트
- query plan을 확인하다보면 원하지 않는 인덱스를 탄다거나, 인덱스를 타지 않는 경우, 인덱스 순서가 비효율적인 경우가 종종 발생한다.
- 쿼리가 복잡한 경우 종종 발생하는데, 이럴 때 인덱스에 대한 힌트를 쿼리에 심어주어 원하는 인덱스를 탈 수 있도록 도울 수 있다.
- FORCE INDEX
- USE 키워드와 동일한 기능을 하지만, 옵티마이저에게 보다 강하게 해당 인덱스를 사용하도록 권장
- 지정한 인덱스만 사용하도록 명령
-
SELECT * FROM TEST_TABLE FORCE INDEX(INK1_TEST_TABLE) WHERE id = 1 AND name = "박진영";
- USE 키워드와 동일한 기능을 하지만, 옵티마이저에게 보다 강하게 해당 인덱스를 사용하도록 권장
- USE INDEX
- 특정 인덱스를 사용하도록 권장
- 지정한 인덱스를 우선적으로 사용하되, 옵티마이저가 다른 인덱스를 사용하는 것이 낫다고 판단하면 다른 인덱스를 사용
-
SELECT * FROM TEST_TABLE USE INDEX(INK1_TEST_TABLE) WHERE id = 1 AND name = "박진영";
- 특정 인덱스를 사용하도록 권장
- IGNORE INDEX
- 특정 인덱스를 사용하지 않도록 지정
-
SELECT * FROM TEST_TABLE IGNORE INDEX(INK2_TEST_TABLE) WHERE id = 1 AND name = "박진영";
- join과 oreder by, group by에도 인덱스 힌트를 줄 수 있다.
USE INDEX FOR JOIN
- JOIN 키워드는 테이블 간 조인 뿐만아니라 레코드 검색하는 용도까지 포함
USE INDEX FOR ORDER BY
- 명시된 인덱스를 ORDER BY 용도로만 사용하도록 제한
USE INDEX FOR GROUP BY
- 명시된 인덱스를 GROUP BY 용도로만 사용하도록 제한
Reference
반응형'CS 지식 > 데이터베이스' 카테고리의 다른 글
Surrogate key vs Natural Key (대체 키 vs 자연 키) (0) 2022.07.29 NoSQL (0) 2021.01.14 트랜잭션(Transaction) (0) 2021.01.14 정규화 (0) 2021.01.14 인덱스(Index) (0) 2021.01.14