8.8.5.2 전환 가능한 최적화 제어
optimizer_switch
시스템 변수를 사용하면 최적화 프로그램의 동작을 제어 할 수 있습니다. 그 값은 플래그 세트에 각각 대응하는 최적화 작업을 활성화하거나 비활성화 하는지를 나타내는 on
또는 off
값을가집니다. 이 변수는 글로벌 값과 세션 값이 런타임에 변경할 수 있습니다. 전역 값의 기본값은 서버를 시작할 때 설정할 수 있습니다.
최적화 현재의 플래그 세트를 표시하려면 변수 값을 선택합니다.
mysql> SELECT @@optimizer_switch\G
*************************** 1. row ******************** *******
@@ optimizer_switch : index_merge = on, index_merge_union = on,
index_merge_sort_union = on,
index_merge_intersection = on,
engine_condition_pushdown = on,
index_condition_pushdown = on,
mrr = on, mrr_cost_based = on,
block_nested_loop = on, batched_key_access = off,
materialization = on, semijoin = on, loosescan = on,
firstmatch = on,
subquery_materialization_cost_based = on,
use_index_extensions = on
optimizer_switch
값을 변경하려면 하나 이상의 명령의 쉼표로 구분 된 목록으로 구성된 값을 할당합니다.
SET [GLOBAL | SESSION] optimizer_switch = ' command
[, command
] ... ';
각 command
값은 다음 표에 나열된 형식 중 하나가되도록하십시오.
명령 구문 | 의미 |
---|---|
default | 모든 최적화를 기본값으로 재설정합니다 |
| 지정한 최적화를 기본값으로 설정합니다 |
| 지정한 최적화를 비활성화합니다 |
| 지정한 최적화를 사용합니다 |
default
명령이 있으면 먼저 실행되지만 값 중 명령의 순서는 중요하지 않습니다. opt_name
플래그를 default
로 설정하면 기본값이 on
또는 off
중 이어도 그것을 설정됩니다. 값에 특정 opt_name
을 여러 번 지정하는 것은 허용되지 않고 오류가 발생합니다. 값 오류로 인해 할당이 오류와 함께 실패하고 optimizer_switch
값이 변경되지 않은 상태입니다.
다음 표는 최적화 전략별로 그룹화 허용되는 opt_name
플래그 이름을 나열합니다.
최적화 | 플래그 이름 | 의미 |
---|---|---|
Batched Key Access | batched_key_access | BKA 결합 알고리즘의 사용을 제어합니다 |
Block Nested Loop | block_nested_loop | BNL 결합 알고리즘의 사용을 제어합니다 |
엔진 조건문 푸시 다운 | engine_condition_pushdown | 엔진 조건문 푸시 다운을 제어합니다 |
인덱스 조건문 푸시 다운 | index_condition_pushdown | 인덱스 조건문 푸시 다운을 제어합니다 |
인덱스 확장 | use_index_extensions | 인덱스 확장의 사용을 제어합니다 |
인덱스 병합 | index_merge | 모든 인덱스 병합 최적화를 제어합니다 |
index_merge_intersection | 인덱스 병합 공통 집합 액세스 최적화를 제어합니다 | |
index_merge_sort_union | 인덱스 병합 정렬 합집합 액세스 최적화를 제어합니다 | |
index_merge_union | 인덱스 병합 합집합 액세스 최적화를 제어합니다 | |
Multi-Range Read | mrr | Multi-Range Read 전략을 제어합니다 |
mrr_cost_based | mrr=on 의 경우 비용 기반 MRR의 사용을 제어합니다 | |
준 결합 | semijoin | 모든 준 결합 전략을 제어합니다 |
firstmatch | 준 결합 FirstMatch 전략을 제어합니다 | |
loosescan | 준 결합 LooseScan 전략을 제어합니다 ( GROUP BY 의 LooseScan과 혼동하지 마십시오) | |
서브 쿼리 구체화 | materialization | 실체화를 제어합니다 (준 결합 실체화 포함) |
subquery_materialization_cost_based | 사용 된 비용 기반의 실체화의 선택 |
block_nested_loop
및 batched_key_access
플래그는 MySQL 5.6.3에서 추가되었습니다. batched_key_access
가 on
으로 설정되어있는 경우에 어떤 효과를 가지려면, mrr
플래그도 on
이어야합니다. 현재 MRR 비용 견적은 매우 비관적입니다. 따라서 BKA을 사용하려면 mrr_cost_based
를 off
로해야합니다.
semijoin
, firstmatch
, loosescan
및 materialization
플래그는 MySQL 5.6.5에서 준 결합 및 서브 쿼리 실체화 전략을 제어 할 수 있도록하기 위해 추가되었습니다. semijoin
플래그는 준 조인을 사용할지 여부를 제어합니다. 이것이 on
으로 설정되어있는 경우 firstmatch
및 loosescan
플래그는 사용 가능한 준 결합 전략을 세밀하게 제어 할 수 있습니다. materialization
플래그는 서브 쿼리 구체화를 사용할지 여부를 제어합니다. semijoin
과 materialization
이 모두 on
의 경우 해당하면 준 결합도 구체화가 사용됩니다. 이러한 플래그는 기본적으로 on
입니다.
subquery_materialization_cost_based
은 MySQL 5.6.7에서 서브 쿼리 구체화 및 IN -> EXISTS
서브 쿼리 변환의 선택을 제어 할 수 있도록하기 위해 추가되었습니다. 플래그가 on
(디폴트)의 경우, 최적화는 서브 쿼리 구체화 및 IN -> EXISTS
서브 쿼리 변환의 두 가지 방법 모두 사용할 수있는 경우 비용 기반 선택을 실행합니다. 플래그가 off
의 경우 최적화 프로그램은 MySQL 5.6.7 이전 동작이었다 IN -> EXISTS
서브 쿼리 변환보다 하위 쿼리 구체화를 선택합니다.
개별 최적화 전략에 대한 자세한 내용은 다음 섹션을 참조하십시오.
섹션 8.2.1.14 "Block Nested Loop 조인과 Batched Key Access 결합"
섹션 8.2.1.5 "엔진 조건문 푸시 다운 최적화"
섹션 8.2.1.7 "인덱스 확장의 사용"
섹션 8.2.1.6 "인덱스 조건문 푸시 다운 최적화"
섹션 8.2.1.4 "인덱스 병합 최적화"
섹션 8.2.1.13 "Multi-Range Read 최적화"
섹션 8.2.1.18 "서브 쿼리의 최적화"
optimizer_switch
에 값을 지정하면 지정되지 않은 플래그는 그 현재 값을 유지합니다. 이에 따라 다른 동작에 영향을주지 않고 단일 명령문에서 특정 최적화 동작을 활성화하거나 비활성화 할 수 있습니다. 문은 다른 존재 최적화 플래그와 그 값에 의존하지 않습니다. 모든 인덱스 병합 최적화가 활성화되어 있다고합니다.
mysql> SELECT @@optimizer_switch\G
*************************** 1. row ******************** *******
@@ optimizer_switch : index_merge = on, index_merge_union = on,
index_merge_sort_union = on,
index_merge_intersection = on,
engine_condition_pushdown = on,
index_condition_pushdown = on,
mrr = on, mrr_cost_based = on,
block_nested_loop = on, batched_key_access = off,
materialization = on, semijoin = on, loosescan = on,
firstmatch = on,
subquery_materialization_cost_based = on,
use_index_extensions = on
서버가 특정 쿼리에 대해 인덱스 병합 합집합 접근 방법과 인덱스 병합 정렬 합집합 접근 방법을 사용하고 있으며, 그들이 없다면 옵티마이 저의 실행이 개선되는지 여부를 확인하는 경우 변수 값 를 다음과 같이 설정합니다.
mysql>SET optimizer_switch='index_merge_union=off,index_merge_sort_union=off';
mysql>SELECT @@optimizer_switch\G
*************************** 1. row ******************** ******* @@ optimizer_switch : index_merge = on, index_merge_union = off, index_merge_sort_union = off, index_merge_intersection = on, engine_condition_pushdown = on, index_condition_pushdown = on, mrr = on, mrr_cost_based = on, block_nested_loop = on, batched_key_access = off, materialization = on, semijoin = on, loosescan = on, firstmatch = on, subquery_materialization_cost_based = on, use_index_extensions = on