Hint 옵티마이저의 실행 계획을 원하는 대로 바꿀수 있게 해준다.
계발자가 조인이나 인덱스의 잘못된 실행 계획을 개발자가 직접 바꿀 수 있도록 도와주는 것이다.
Select 문에
/*+HINT */
이렇게 들어간다.
왜 사용해??
- 성능 향상: 적절한 힌트를 사용하면 쿼리 성능을 향상시킬 수 있다. 예를 들어, 인덱스를 사용하지 않거나 잘못된 인덱스를 사용하는 쿼리가 있다면 인덱스 힌트를 사용하여 적절한 인덱스를 사용하도록 할 수 있다. 또는 JOIN 순서가 잘못되어 성능이 저하되는 경우 STRAIGHT_JOIN 힌트를 사용하여 JOIN 순서를 강제로 조정할 수 있다.
- 예측 가능성: 옵티마이저는 실행 계획을 최적화하기 위해 여러 가지 규칙을 적용한다다. 하지만 모든 상황에서 최적의 실행 계획을 만들어내는 것은 어렵다. 힌트를 사용하면 쿼리 실행 계획을 예측 가능하게 만들 수 있다.
- 테스트: 특정 힌트를 사용하면 실행 계획이 어떻게 바뀌는지 확인할 수 있다. 이를 통해 쿼리 실행 계획에 대한 이해도를 높일 수 있다.
옵티마이저 힌트
옵티마이저 힌트는 데이터베이스 옵티마이저가 쿼리 실행 계획을 선택할 때 사용되는 힌트이다.
쿼리에 대한 실행 계획을 수동으로 지정할 수 있다.
일반적으로는 데이터베이스 옵티마이저가 자동으로 최적의 실행 계획을 선택하지만,
특정한 상황에서는 수동으로 실행 계획을 지정해야 할 필요가 있다.
옵티마이저 힌트는 범위에 따라 적용된다.
- Global : 전체 쿼리
- Query Block: 특정 쿼리 블록에 사용 할 수 있다. 힌트가 명시된 쿼리 블록에 대해서만 영향이 미침.
- Table-Level: 특정 레이블의 이름을사용할 수 있는 힌트
- Index-Level: 특정 인덱스의 이름을 사용할 수 있는 힌트
STRAIGHT_JOIN : 조인 순서 강제 지시
SELECT * FROM table1 STRAIGHT_JOIN table2 WHERE ...
첫 번째 테이블을 읽고, 두 번째 테이블에서 해당 레코드를 가져오도록 하여 JOIN 성능을 최적화할 수 있다.
SQL_BUFFER_RESULT : 결과를 버퍼링하여 쿼리 수행시간 단축
SELECT SQL_BUFFER_RESULT * FROM table1 WHERE ...
이 힌트는 결과를 디스크가 아닌 메모리에 캐시하도록 MySQL 옵티마이저에게 지시한다.
이를 사용하면 쿼리가 실행되고 결과가 반환될 때까지 전체 결과 집합을 서버에서 캐시할 수 있으며,
이를 통해 더 빠른 결과 반환 및 다른 쿼리 실행 시간 감소 효과를 얻을 수 있다
SQL_NO_CACHE : 캐시 사용 무시하여 쿼리 수행시간 단축
SELECT SQL_NO_CACHE * FROM table1 WHERE ...
이 힌트는 결과를 캐시하지 않도록 MySQL 옵티마이저에게 지시한다,
이를 사용하면 결과를 캐시하지 않으므로 결과 집합이 변경되었을 때 항상 최신 결과를 가져올 수 있다.
인덱스 힌트
인덱스 힌트는 데이터베이스 엔진이 쿼리를 실행할 때 사용할 인덱스를 지정하는 방법,
인덱스 힌트를 사용하면 데이터베이스 엔진이 자체적으로 결정한 최적의 실행 계획과는 다른 실행 계획을 수행할 수 있다.
USE INDEX : 특정 인덱스 사용하도록 지시 가장 자주 사용되는 힌트다
SELECT /*+ USE INDEX (index1) */ * FROM table1 WHERE column1 = 1;
SELECT USE INDEX (index1) FROM table1 WHERE column1 = 1;
옵티마이저 힌트를 사용할때는 /*+ */ 을 사용을 권장한다. 하지만 아랫줄 코드처름 주석처리없이 코드작성이 가능하다
IGNORE INDEX : 특정 인덱스 무시하도록 지시
SELECT * FROM table1 IGNORE INDEX (index1) WHERE ...
FORCE INDEX : 특정 인덱스 강제로 사용하도록 지시 USE INDEX 보다 옵티마이저에게 미치는 영향이 더 강한 힌트다
SELECT * FROM table1 FORCE INDEX (index1) WHERE ...
예시
힌트를 사용 하지 않았을때이다
SELECT *
FROM customer
WHERE city = 'New York';
옵티마이저 힌트
SELECT /*+ INDEX(customer city) */ *
FROM customer
WHERE city = 'New York';
인덱스 힌트
SELECT *
FROM customer USE INDEX (city)
WHERE city = 'New York';
같이 사용하는 경우
SELECT /*+ INDEX(customer city) */ *
FROM customer
USE INDEX (city)
WHERE city = 'New York';
USE INDEX,IGNORE INDEX 등 겹치는 힌트들이 있다.
즉 간단하게 말하면
옵티마이저 힌트는 select 문에 쓰고 >>> 쿼리 전체에 영향을 미친다.
인덱스 힌트는 from 절에 쓰는걸로 이해하면 된다 >> 쿼리의 일부분에만 영향을 끼친다
댓글