• 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문 최적화
    1. SELECT문 최적화
    1. SELECT문 속도
    2. MySQL WHERE절 최적화 방법
    3. range 최적화
    4. 인덱스 병합 최적화
    5. 엔진 조건문 푸시 다운 최적화
    6. 인덱스 조건문 푸시 다운 최적화
    7. 인덱스 확장의 사용
    8. IS NULL 최적화
    9. LEFT JOIN과 RIGHT JOIN 최적화
    10. Nested Loop 조인 알고리즘
    11. 중첩 된 결합의 최적화
    12. 외부 조인의 단순화
    13. Multi-Range Read 최적화
    14. Block Nested Loop 조인과 Batched Key Access 결합
    15. ORDER BY 최적화
    16. GROUP BY 최적화
    17. DISTINCT 최적화
    18. 서브 쿼리의 최적화
    19. LIMIT 쿼리의 최적화
    20. 풀 테이블 스캔을 피하는 방법
    2. DML문 최적화
    3. 데이터베이스 권한 최적화
    4. INFORMATION_SCHEMA 쿼리 최적화
    5. 기타 최적화 Tips
    3. 최적화 및 인덱스
    4. 데이터베이스 구조의 최적화
    5. InnoDB 테이블의 최적화
    6. MyISAM 테이블의 최적화
    7. MEMORY 테이블 최적화
    8. 쿼리 실행 계획의 이해
    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.2.1.4 인덱스 병합 최적화

인덱스 병합 방법은 여러 range 스캔하여 행을 검색하고 그 결과를 하나로 병합하는 데 사용됩니다. 이 병합하여 그 기반이되는 검사의 합집합 공통 집합 또는 공통 집합의 합집합을 할 수 있습니다. 이 접근 방법은 하나의 테이블에서 인덱스 스캔을 병합합니다. 여러 테이블에 걸쳐 검사는 병합하지 않습니다.

EXPLAIN 출력은 인덱스 병합 방법은 type 컬럼에 index_merge 표시됩니다. 이 경우 key 컬럼은 사용 된 인덱스의 목록이 포함되어 key_len 는 그 인덱스의 긴 키 부분의 목록이 포함됩니다.

예 :

 SELECT * FROM tbl_name WHERE key1 = 10 OR key2 = 20;

 SELECT * FROM tbl_name
   WHERE ( key1 = 10 OR key2 = 20) AND non_key = 30;

 SELECT * FROM t1, t2
   WHERE (t1. key1 IN (1,2) OR t1. key2 LIKE ' value % ')
   AND t2. key1 = t1. some_col ;

 SELECT * FROM t1, t2
   WHERE t1. key1 = 1
   AND (t2. key1 = t1. some_col OR T2. key2 = t1. some_col2 );

인덱스 병합 방법에는 몇 가지 액세스 알고리즘이 있습니다 ( EXPLAIN 출력의 Extra 필드에서 확인됩니다).

  • Using intersect(...)

  • Using union(...)

  • Using sort_union(...)

다음 섹션에서는 이러한 방법에 대해 자세히 설명합니다.

참고

인덱스 병합 최적화 알고리즘은 다음의 알려진 문제가 있습니다.

  • 쿼리에 AND / OR 깊은 중첩되어있는 복잡한 WHERE 절이 있으며, MySQL이 최적의 플랜을 선택하지 않으면 다음과 같은 일률적를 사용하여 항목을 분배 해보십시오.

     ( x AND y ) OR z = ( x OR z ) AND ( y OR z )
     ( x OR y ) AND z = ( x AND z ) OR ( y AND z )
    
  • 인덱스 병합은 전체 텍스트 인덱싱에 적용되지 않습니다. 미래의 MySQL 릴리스에서 이들을 처리하도록 그것을 확장 할 예정입니다.

  • MySQL 5.6.6 이전 버전에서는 일부의 키에 범위 스캔이 사용 가능한 경우 옵티마이 저가 인덱스 병합 합집합 또는 인덱스 병합 정렬 합집합 알고리즘을 사용하는 것을 고려하지 않습니다. 예를 들어, 다음 쿼리를 고려합니다.

     SELECT * FROM t1 WHERE (goodkey1 <10 OR goodkey2 <20) AND badkey <30;
    

    이 쿼리에서는 두 가지 계획이 사용 가능합니다.

    • (goodkey1 < 10 OR goodkey2 < 20) 조건을 사용하여 인덱스 병합 스캔.

    • badkey < 30 조건을 사용하는 범위 스캔.

    그러나 최적화 프로그램은 두 번째 계획 만 고려하지 않습니다.

인덱스 병합 접근 방법의 가능성이있는 다양한 변종과 다른 접근 방식의 선택은 사용 가능한 다양한 옵션의 비용 추정에 근거합니다.

8.2.1.4.1 인덱스 병합 공통 집합 액세스 알고리즘

이 접근 알고리즘은 WHERE 절이 AND 로 결합 된 다양한 키에 대한 여러 범위 조건으로 변환되어 각 조건이 다음 중 하나 인 경우에 채용 할 수 있습니다.

  • 이 형식은 인덱스에 정확히 N 개의 부분이 있습니다 (즉, 모든 인덱스 부분이 커버됩니다).

     key_part1 = const1 AND key_part2 = const2 ... AND key_partN = constN
    
  • InnoDB 테이블의 기본 키에 대한 범위 조건.

예 :

 SELECT * FROM innodb_table WHERE primary_key <10 AND key_col1 = 20;

 SELECT * FROM tbl_name
   WHERE ( key1_part1 = 1 AND key1_part2 = 2) AND key2 = 2;

인덱스 병합 공통 집합 알고리즘은 사용 된 모든 인덱스의 동시 검색을 실행하고 병합 된 인덱스 스캔에서받을 줄 시퀀스의 공통 집합을 생성합니다.

쿼리에 사용 된 모든 컬럼이 사용되는 인덱스에 의해 커버되는 경우 전체 테이블 행이 검색되지 않습니다 (이 경우 EXPLAIN 출력의 Extra 필드에 Using index 가 포함되어 있습니다). 다음은 이러한 쿼리의 예입니다.

 SELECT COUNT (*) FROM t1 WHERE key1 = 1 AND key2 = 1;

사용되는 인덱스 쿼리에 사용 된 모든 컬럼이 포함되지 않는 경우 사용되는 모든 키의 범위 조건이 충족되는 경우에만 전체 행이 검색됩니다.

병합 된 조건 중 하나가 InnoDB 테이블의 기본 키에 대한 조건 인 경우, 그것은 행의 취득에 사용되지 않지만 다른 조건을 사용하여 검색된 행을 필터링하는 데 사용됩니다 합니다.

8.2.1.4.2 인덱스 병합 합집합 액세스 알고리즘

이 알고리즘의 적용 기준은 인덱스 병합 메소드 공통 집합 알고리즘의 경우와 비슷합니다. 이 알고리즘은 테이블의 WHERE 절이 OR 로 결합 된 다양한 키에 대한 여러 범위 조건으로 변환되어 각 조건이 다음 중 하나 인 경우에 채용 할 수 있습니다.

  • 이 형식은 인덱스에 정확히 N 개의 부분이 있습니다 (즉, 모든 인덱스 부분이 커버됩니다).

     key_part1 = const1 AND key_part2 = const2 ... AND key_partN = constN
    
  • InnoDB 테이블의 기본 키에 대한 범위 조건.

  • 인덱스 병합 메소드 공통 집합 알고리즘을 적용 할 수있는 조건.

예 :

 SELECT * FROM T1 WHERE key1 = 1 OR key2 = 2 OR key3 = 3;

 SELECT * FROM innodb_table WHERE ( key1 = 1 AND key2 = 2) OR
   ( key3 = 'foo'AND key4 = 'bar') AND key5 = 5;
8.2.1.4.3 인덱스 병합 정렬 합집합 액세스 알고리즘

이 접근 알고리즘은 WHERE 절이 OR 로 결합 된 여러 범위 조건으로 변환되어 있지만, 인덱스 병합 방법 합집합 알고리즘을 적용 할 수 없을 때 사용됩니다.

예 :

 SELECT * FROM tbl_name WHERE key_col1 <10 OR key_col2 <20;

 SELECT * FROM tbl_name
   WHERE ( key_col1 > 10 OR key_col2 = 20) AND nonkey_col = 30;

정렬 합집합 알고리즘과 합집합 알고리즘의 차이는 정렬 화 집합 알고리즘은 행을 반환하기 전에 먼저 모든 행의 행 ID를 가져 와서 그들을 정렬 할 필요가있는 것입니다.


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