STRAIGHT_JOIN
과 USE INDEX
등의 인덱스 힌트는 모두 ANSI-SQL 표준 문법을 준수하지 못하는 단점이 있다.SELECT
, UPDATE
명령에서만 사용할 수 있다.STRAIGHT_JOIN
은 옵티마이저 힌트인 동시에 조인 키워드이다.STRAIGHT_JOIN
은 SELECT, UPDATE, DELETE 쿼리에서 여러 테이블이 조인되는 경우 조인 순서를 고정하는 역할을 한다.
STRAIGHT_JOIN
힌트를 사용하면 FROM
절에 명시된 순서대로 조인을 수행한다.SELECT STRAIGHT_JOIN
e.first_name, e.last_name, de.dept_name
FROM employees e, dept_emp de, departments d
WHERE e.emp_no=de.emp_no
AND d.dept_no=de.empt_no;
WHERE
조건까지 포함해서 조건을 만족하는 레코드 건수이다.STRAIGHT_JOIN
과 비슷한 역할을 하는 옵티마이저 힌트
JOIN_FIXED_ORDER
JOIN_ORDER
JOIN_PREFIX
JOIN_SUFFIX
PRIMARY
라고 명시USE IDEX
SELECT * FROM employees USE INDEX(primary) WHERE emp_no=’10001;
FORCE INDEX
USE INDEX
와 비슷하지만 옵티마이저에게 미치는 영향이 더 강한 힌트다. 하지만 거의 사용할 필요가 없으며 USE INDEX
힌트로도 그 인덱스를 사용하지 않은 경우라면 FORCE INDEX
를 써도 마찬가지였다.SELECT * FROM employees FORCE INDEX(primary) WHERE emp_no=’10001;
IGNORE INDEX
SELECT * FROM employees IGNOIRE INDEX(ix_firstname) WHERE emp_no=’10001;
USE INDEX FOR JOIN
: 테이블 간 조인뿐만 아니라 레코드를 검색하기 위한 용도까지 포함하는 용어USE INDEX FOR ORDER BY
: 명시된 인덱스를 ORDER BY
용도로만 사용하도록 제한USE INDEX FOR GROUP BY
: 명시된 인덱스를 GROUP BY
용도로만 사용하도록 제한SQL_CALC_FROUND_ROWS
힌트를 사용하면 LIMIT
를 만족하는 수의 레코드를 찾았더라도 끝까지 검색을 수행한다.
LIMIT
만큼 레코드를 찾으면 즉시 검색 작업을 멈춘다.SQL_CALC_FROUND_ROWS
힌트를 사용한 후 FOUND_ROWS()
함수를 이용해 LIMIT
를 제외한 조건을 만족하는 레코드 수를 알 수 있다.SELECT SQL_CALC_FOUND_ROWS * FROM employees LIMIT 5;
SELECT FOUND_ROWS() AS total_record_count;
|------------------|
|total_record_count|
|------------------|
|3000024 |
|------------------|
COUNT(*)
쿼리로 처리하는 것이 더 효율적이기 때문에 굳이 사용하지 않아도 되는 힌트이다.