쿼리 힌트
쿼리 힌트는 인덱스 힌트와 옵티마이저 힌트로 구분할 수 있다.
인덱스 힌트
인덱스 힌트는 SQL의 문법에 맞게 사용해야 해서 ANSI-SQL 표준 문법을 준수하지 못하게 되는 단점이 있다. 그래서 가능하다면 인덱스 힌트보다는 옵티마이저 힌트를 사용하는게 좋다. 인덱스 힌트는 SELECT와 UPDATE 명령에서만 사용할 수 있다.
- STRAIGHT_JOIN
SELECT STRAIGHT_JOIN
*
FROM example1 e1, example2 e2
WHERE ...
여러 개의 테이블이 조인되는 경우 조인 순서를 고정할 수 있다. FROM 절에 명시된 테이블의 순서대로 조인을 수행하도록 한다.
- USE INDEX / FORCE INDEX / IGNORE INDEX
SELECT * FROM example USE INDEX(primary) WHERE id=1;
SELECT * FROM example FORCE INDEX(primary) WHERE id=1;
SELECT * FROM example IGNORE INDEX(primary) WHERE id=1;
USE INDEX: 옵티마이저에게 특정 테이블의 인덱스를 사용하도록 권장하는 힌트
FORCE INDEX: 옵티마이저에게 특정 테이블의 인덱스를 사용하도록 더 강하게 권장하는 힌트
IGNORE INDEX: 인덱스를 사용하지 못하게 하는 힌트
인덱스의 사용법이나 좋은 실행 계획이 어떤 것인지 판단하기 힘들다면 힌트의 사용을 피하는 것이 좋다.
가장 훌륭한 최적화는 그 쿼리를 서비스에서 없애 버리거나 튜닝할 필요가 없게 데이터를 최소화하는 것이며, 그것이 어렵다면 데이터 모델의 단순화를 통해 쿼리를 간결하게 만들고 힌트가 필요치 않게 하는 것이다.
- SQL_CALC_FOUND_ROWS
MySQL의 LIMIT을 사용하는 경우, 조건을 만족하는 레코드가 LIMIT에 명시된 수보다 더 많다고 하더라도 즉시 검색 작업을 멈춘다. 하지만 SQL_CALC_FOUND_ROWS 힌트를 사용하는 경우에는 끝까지 검색을 수행한다.
페이징에 적용하기 위해 이 힌트를 사용하는 경우, 성능이 안 나올 수 있다. 예외적인 경우도 있을 수 있겠지만, 일반적으로는 SQL_CALC_FOUND_ROWS 보다는 레코드 카운터용 쿼리와 데이터를 조회하는 쿼리를 분리하는게 더 효율적이다.
참조: 책 Real MySQL 8.0
'Database' 카테고리의 다른 글
| 쿼리 최적화 (0) | 2024.03.14 |
|---|---|
| MySQL(15) - 실행 계획 (0) | 2024.03.06 |
| MySQL(13) - 옵티마이저 (0) | 2024.02.26 |
| MySQL(12) - Index (0) | 2023.10.11 |
| MySQL(11) - Index (0) | 2023.10.10 |