카테고리 없음

[Real MySQL 8.0] 9. 옵티마이저와 힌트 9.3.2

pwhee 2023. 2. 12. 02:59

9.3.2 조인 최적화 알고리즘

조인하는 테이블이 많아질 수록 실행 계획을 세우기 힘들어지고, 수립하는 시간도 더 오래 걸린다.

왜그럴까 이유를 알아보자

조인 최적화 알고리즘 2개

[1] Exhaustive 검색 알고리즘

예전 버전부터 사용되온 알고리즘으로 FROM 절에 명시된 모든 테이블의 조합에 대해 실행 계획의 비용을 계산해서 최적의 1개를 찾는 알고리즘(테이블이 n개면 n!). 굉장히 오래걸리는 알고리즘

[2] Greedy 검색 알고리즘

5.0 부터 도입된 알고리즘. n개 테이블이 있다면 모든 테이블의 조합에 대해 전부 계산하는게 아니라 optimizer_search_depth 시스템 설정 변수에 정의된 테이블 만큼의 조합을 계산해서 최적의 실행계획으로 맨 앞에 오는 테이블을 고정한다. 그다음 남은 n-1개 테이블로 반복한다. 

 

9.4 쿼리 힌트

옵티마이저에게 실행 계획 수립을 위해 힌트를 제공할 수 있다.

2가지로 구분 가능 - 인덱스 힌트, 옵티마이저 힌트

9.4.1 인덱스 힌트

인덱스 힌트를 사용하게 되면ANSI-SQL 표준 문법을 준수하지 못하게 되는 문제가 있다. 옵티마이저 힌트들은 MySQL 제외한 DBMS에서는 주석 취급 되기 때문에 되도록 옵티마이저 힌트를 쓰자.

인덱스 힌트는 SELECT, UPDATE에서만 사용 가능하다.

[1] STRAIGHT_JOIN

옵티마이저 힌트인 동시에 조인 키워드이다. 조인 테이블 순서를 고정한다.

SELECT STRAIGHT_JOIN

e.A, e.B, e.C

FROM table e ...

WHERE ... = ...

AND ..

와 같이 사용한다.

[2] USE_INDEX / FORCE INDEX / IGNORE INDEX

사용하려는 인덱스를 가진 테이블 뒤에 힌트를 붙이면 된다.

3~4개 이상 컬럼을 포함하는 비슷한 인덱스가 여러개일 때 옵티마이저가 가끔 실수하는데, 이를 고정하기 위해 힌트를 추가한다.

USE INDEX: 옵티마이저에게 특정 테이블의 인덱스를 사용하도록 권장

FORCE INDEX: 더 권장

IGNORE INDEX: 특정 인덱스를 사용 못하게 하는 용도

다음과 같이 뒤에 FOR ... 으로 힌트의 용도를 명시할 수 있다

FOR JOIN: 조인 뿐만아니라 조회에도 사용하도록

FOR ORDER BY: 의미대로

FOR GROUP BY: 의미대로

[3] SQL_CALC_FOUND_ROWS

LIMIT이 사용되도 일단 끝까지 검색을 하게하는 힌트