8.2.1.13 Multi-Range Read 최적화
보조 인덱스의 범위 스캔을 사용하여 행을 읽을 때 테이블이 크고, 스토리지 엔진의 캐시에 저장되어 있지 않은 경우, 기본 테이블에 랜덤 디스크 액세스가 다발하는 결과가 될 수 있습니다. Disk-Sweep Multi-Range Read (MRR) 최적화를 사용하면 MySQL은 먼저 인덱스 만 검사하고 해당 행의 열쇠를 수집하여 범위 스캔의 디스크 접근 횟수를 줄이기 위해 노력하고 합니다. 이어 키가 정렬되고 마지막으로 기본 키 순서를 사용하여 기본 테이블에서 행이 검색됩니다. Disk-Sweep MRR의 목적은 디스크 접근 횟수를 줄이고 그 대신 기본 테이블 데이터의 순차적 스캔을 늘리는 것입니다.
Multi-Range Read 최적화에는 다음과 같은 이점이 있습니다.
MRR은 데이터 행은 인덱스 튜플에 따라 임의의 순서가 아닌 순차 액세스 할 수 있습니다. 서버는 쿼리 조건을 충족 인덱스 튜플 집합을 검색하고이를 데이터 행 ID 순서에 따라 정렬하고 정렬 된 튜플을 사용하여 데이터 행을 순차적으로 가져옵니다. 이를 통해 데이터 액세스의 효율을 향상시키고 부하가 경감됩니다.
MRR하여 범위 인덱스 스캔과 결합 특성에 인덱스를 사용하는 등가 조인과 같은 인덱스 튜플 통해 데이터 행에 대한 액세스를 필요로하는 작업의 키 액세스 요청을 일괄 처리 할 수 있습니다. MRR은 인덱스 범위의 순서를 반복하여 대상의 인덱스 튜플을 가져옵니다. 이러한 결과가 누적되면 그들은 해당 데이터 행에 액세스하는 데 사용됩니다. 데이터 행 읽기를 시작하기 전에 모든 인덱스 튜플을받을 필요가 없습니다.
다음 시나리오에서는 MRR 최적화에 이익이있는 경우에 대해 설명하고 있습니다.
시나리오 A : 인덱스 범위 스캔과 등가 조인 연산에서 InnoDB
테이블과 MyISAM
테이블에 MRR을 사용할 수 있습니다.
인덱스 튜플의 일부는 버퍼에 누적됩니다.
버퍼 내의 튜플은 그 데이터 행 ID가 정렬됩니다.
데이터 행은 정렬 된 인덱스 튜플 순서에 따라 사용됩니다.
시나리오 B : 여러 범위 인덱스 스캔 또는 속성에 의해 등가 조인을 수행 할 때 NDB
테이블에서 MRR을 사용할 수 있습니다.
단일 키 범위 수있는 범위의 일부 쿼리가 전송되는 중앙 노드의 버퍼에 누적됩니다.
범위는 데이터 행에 액세스하는 실행 노드로 전송됩니다.
액세스 된 행은 패키지에 포함되어 중앙 노드에게 반송됩니다.
받은 데이터 행을 포함하는 패키지를 버퍼링합니다.
데이터 행을 버퍼에서 읽습니다.
MRR가 사용 된 경우 EXPLAIN
출력의 Extra
컬럼에 Using MRR
로 표시됩니다.
InnoDB
와 MyISAM
은 쿼리 결과를 생성하기 위해 전체 테이블 행에 액세스 할 필요가없는 경우 MRR을 사용하지 않습니다. 이것은 ( 커버링 인덱스 를 통해) 인덱스 튜플의 정보에 완전히 따라 결과를 생성 할 수있는 경우이며, MRR 혜택은 없습니다.
MRR을 사용할 수 있으며 (
에 인덱스가 있다고 가정하는 쿼리의 예 : key_part1
, key_part2
)
SELECT * FROM t WHEREkey_part1
> = 1000 ANDkey_part1
<2000 ANDkey_part2
= 10000;
인덱스는 (
값의 튜플로 구성되어 먼저 key_part1
, key_part2
)key_part1
의해 다음 key_part2
의해 정렬됩니다.
MRR을 사용하지 않으면 인덱스 스캔은 인덱스 튜플의 key_part2
값에 관계없이 1000에서 최대 2000 key_part1
범위의 모든 인덱스 플이 적용됩니다. 스캔 범위 내의 튜플 10000 이외의 key_part2
값을 포함하는 한, 추가 작업을 수행합니다.
MRR을 사용하면 스캔이 key_part1
의 하나의 값 (1000, 1001 ... 1999)에 하나씩 여러 범위로 분할됩니다. 이러한 각 스캔은 key_part2
= 10000의 튜플만을 검색 할 수 있습니다. 인덱스에 key_part2
가 10000이 아닌 다수의 튜플이 포함 된 경우 MRR하여 읽을 인덱스 플이 크게 줄어 듭니다.
이를 간격 표기를 사용하여 표현은 비 MRR 스캔에서 key_part2
= 10000 튜플이 아닌 다수의 튜플이 포함될 수있는 인덱스 범위 [{1000, 10000}, {2000, MIN_INT})
를 조사 해야합니다. MRR 검사는 key_part2
= 10000의 튜플만을 포함한 여러 단일 포인트 간격 [{1000, 10000}]
, ..., [{1999, 10000}]
를 조사합니다.
두 optimizer_switch
시스템 변수 플래그는 MRR 최적화 사용에 대한 인터페이스를 제공합니다. mrr
플래그는 MRR을 사용할지 여부를 제어합니다. mrr
이 유효하다 ( on
) 경우 mrr_cost_based
플래그는 최적화가 MRR을 사용하거나 사용하지 않거나 비용 기준으로 선택하려고 시도 ( on
)하거나 가능한 한 MRR 사용 ( off
) 여부 를 제어합니다. 기본적으로 mrr
는 on
으로 mrr_cost_based
은 on
입니다. 섹션 8.8.5.2 "전환 가능한 최적화 제어" 를 참조하십시오.
MRR은 스토리지 엔진이 해당 버퍼에 할당 할 수있는 메모리 양의 지침으로 read_rnd_buffer_size
시스템 변수의 값을 사용합니다. 엔진은 최대 read_rnd_buffer_size
바이트를 사용하여 단일 경로에서 처리 할 범위의 수를 결정합니다.