DB/SQL

MYSQL 힌트

호두밥 2021. 10. 7. 10:01

힌트

RDBMS가 효율적으로 데이터를 찾을 수 있도록 추가적인 정보를 제공하기 위한 것.

특정 인덱스를 사용하게 한다던가, 특정 조인 방식으로 유도하는 식으로 사용한다.

 

힌트 작성법

① 주석 표기를 이용 

SELECT COLUMNA, COLUMNB
FROM TALBE /*! USE INDEX (INDEX_NAME) */
WHERE COLUMNA = 'A'

 

② 쿼리의 일부로 작성

SELECT COLUMNA, COLUMNB
FROM TALBE USE INDEX (INDEX_NAME)
WHERE COLUMNA = 'A'

 

힌트 사용시 주의사항

MYSQL은 힌트를 작성하더라고 옵티마이저가 힌트를 따르는 것이 비효율적이라고 생각하면 무시된다.

힌트에 사용된 오브젝트(인덱스, 함수)가 존재하지 않으면 에러가 발생한다.

(오라클에서는 힌트가 잘못되었거나, 비효율적이면 힌트를 무시하고 SQL을 수행하며, 에러를 발생시키지 않는다.) 

 

힌트 종류

USE {INDEX|KEY} [FOR {JOIN|ORDER BY|GROUP BY}] ([index_list])
힌트 종류 힌트 사용법
조인 STRAIGHT JOIN FROM절에 기입된 순서대로 조인하도록 유도
인덱스 USE INDEX 특정 인덱스를 사용하도록 유도
인덱스 FORCE INDEX 특정 인덱스를 강하게 사용하도록 유도(무시하지 않도록)
인덱스 IGNORE INDEX 특정 인덱스를 사용하지 않도록 유도
적용사항 FOR JOIN JOIN에서 어떤 인덱스를 사용할 것인지 유도
적용사항 FOR ORDER BY ORDER BY에서 어떤 인덱스를 사용할 것인지 유도
적용사항 FOR GROUP BY GROUP BY에서 어떤 인덱스를 사용할 것인지 유도

[힌트 여러개를 사용할 수 있음]

* 인덱스 i1을 사용하고, 인덱스 i2는 사용하지 않도록 해서 정렬을 수행 

SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX FOR ORDER BY (i2) ORDER BY a;

[같은 내용의 힌트를 중복해서 사용할 수 있음] 

SELECT * FROM t1 USE INDEX (i1) USE INDEX (i1,i1);

[서로 상반되는 내용의 힌트를 쓰면 오류 발생]

SELECT * FROM t1 USE INDEX FOR JOIN (i1) FORCE INDEX FOR JOIN (i2);

[ FOR 문을 쓰지 않으면 모든 경우에 힌트를 적용함 ]

* 두 힌트가 의미하는 바가 같음.

IGNORE INDEX (i1)
IGNORE INDEX FOR JOIN (i1)
IGNORE INDEX FOR ORDER BY (i1)
IGNORE INDEX FOR GROUP BY (i1)

 

 

출처

양바른, 업무에 바로 쓰는 SQL 튜닝, 한빛미디어

Oracle, 8.9.4 Index Hints, MySQL 8.0 Reference Manual 

'DB > SQL' 카테고리의 다른 글

MySQL 쿼리 정리  (0) 2021.10.10
MYSQL SELECT 튜닝  (0) 2021.10.10
MySQL 데이터 타입 Data Types  (0) 2021.10.10
MYSQL 실행계획 EXPLAIN  (0) 2021.10.08
ORACLE과 MYSQL의 차이점  (2) 2021.10.07