8.2.1.4 인덱스 병합 최적화
인덱스 병합 방법은 여러 range
스캔하여 행을 검색하고 그 결과를 하나로 병합하는 데 사용됩니다. 이 병합하여 그 기반이되는 검사의 합집합 공통 집합 또는 공통 집합의 합집합을 할 수 있습니다. 이 접근 방법은 하나의 테이블에서 인덱스 스캔을 병합합니다. 여러 테이블에 걸쳐 검사는 병합하지 않습니다.
EXPLAIN
출력은 인덱스 병합 방법은 type
컬럼에 index_merge
표시됩니다. 이 경우 key
컬럼은 사용 된 인덱스의 목록이 포함되어 key_len
는 그 인덱스의 긴 키 부분의 목록이 포함됩니다.
예 :
SELECT * FROMtbl_name
WHEREkey1
= 10 ORkey2
= 20; SELECT * FROMtbl_name
WHERE (key1
= 10 ORkey2
= 20) ANDnon_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
ANDy
) ORz
= (x
ORz
) AND (y
ORz
) (x
ORy
) ANDz
= (x
ANDz
) OR (y
ANDz
)인덱스 병합은 전체 텍스트 인덱싱에 적용되지 않습니다. 미래의 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
ANDkey_part2
=const2
... ANDkey_partN
=constN
InnoDB
테이블의 기본 키에 대한 범위 조건.
예 :
SELECT * FROMinnodb_table
WHEREprimary_key
<10 ANDkey_col1
= 20; SELECT * FROMtbl_name
WHERE (key1_part1
= 1 ANDkey1_part2
= 2) ANDkey2
= 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
ANDkey_part2
=const2
... ANDkey_partN
=constN
InnoDB
테이블의 기본 키에 대한 범위 조건.인덱스 병합 메소드 공통 집합 알고리즘을 적용 할 수있는 조건.
예 :
SELECT * FROM T1 WHEREkey1
= 1 ORkey2
= 2 ORkey3
= 3; SELECT * FROMinnodb_table
WHERE (key1
= 1 ANDkey2
= 2) OR (key3
= 'foo'ANDkey4
= 'bar') ANDkey5
= 5;
8.2.1.4.3 인덱스 병합 정렬 합집합 액세스 알고리즘
이 접근 알고리즘은 WHERE
절이 OR
로 결합 된 여러 범위 조건으로 변환되어 있지만, 인덱스 병합 방법 합집합 알고리즘을 적용 할 수 없을 때 사용됩니다.
예 :
SELECT * FROMtbl_name
WHEREkey_col1
<10 ORkey_col2
<20; SELECT * FROMtbl_name
WHERE (key_col1
> 10 ORkey_col2
= 20) ANDnonkey_col
= 30;
정렬 합집합 알고리즘과 합집합 알고리즘의 차이는 정렬 화 집합 알고리즘은 행을 반환하기 전에 먼저 모든 행의 행 ID를 가져 와서 그들을 정렬 할 필요가있는 것입니다.