• MySQL매뉴얼
    • MySQL 5.6 매뉴얼
    • MySQL 5.1 매뉴얼
    • MySQL 5.0 매뉴얼
    • MySQL HA 매뉴얼
  • 기술문서
    • Xtrabackup 구성
    • 메모리 사용량 모니터링
  • 라이선스
  • 온라인문의
  • 회사소개
  • → 목 록 (MySQL5.6 한글메뉴얼) [close]
  • 1. MySQL 5.6 새로운 기능
  • 2. MySQL 설치 및 업그레이드
  • 3. MySQL Tutorial
  • 4. MySQL 프로그램
  • 5. MySQL 서버관리
  • 6. 보안
  • 7. 백업 및 복구
  • 8. 최적화
  • 1. 최적화 개요
    2. SQL문 최적화
    3. 최적화 및 인덱스
    4. 데이터베이스 구조의 최적화
    5. InnoDB 테이블의 최적화
    6. MyISAM 테이블의 최적화
    7. MEMORY 테이블 최적화
    8. 쿼리 실행 계획의 이해
    1. EXPLAIN으로 쿼리 최적화
    2. EXPLAIN 출력 포맷
    3. EXPLAIN EXTENDED 출력 포맷
    4. 쿼리 성능 추정
    5. 쿼리 최적화 제어
    1. 쿼리 계획 평가의 제어
    2. 전환 가능한 최적화 제어
    9. 버퍼링과 캐시
    10. 잠금 작업의 최적화
    11. MySQL 서버의 최적화
    12. 성능 측정
  • 9. Language Structure(언어구조)
  • 10. Character Sets(Globalization)
  • 11. 데이터형(Data Types)
  • 12. 함수와 연산자
  • 13. SQL 문법
  • 14. InnoDB 스토리지 엔진
  • 15. 기타 스토리지 엔진
  • 16. 고가용성 및 확장성
  • 17. 리플리케이션
  • 18. MySQL Cluster
  • 19. 파티셔닝
  • 20. Stored Programs and Views
  • 21. INFORMATION_SCHEMA
  • 22. PERFORMANCE SCHEMA
  • 23. 컨넥터 및 API
  • 24. MySQL 확장
  • 25. MySQL Enterprise Edition
  • 26. MySQL Workbench
  • 27. 제약 및 제한
  • 28. MySQL 5.7 새로운 기능

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 모든 최적화를 기본값으로 재설정합니다
opt_name =default 지정한 최적화를 기본값으로 설정합니다
opt_name =off 지정한 최적화를 비활성화합니다
opt_name =on 지정한 최적화를 사용합니다

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


서울시 강남구 영동대로 602 6층
TEL: 02-6061-0006  /  E: csr@mysqlkorea.com
주식회사 이노클러스터  등록번호 : 727-86-02261
Copyright © innocluster Co. ltd. all rights reserved