8.2.1.5 엔진 조건문 푸시 다운 최적화
이 최적화는 인덱스가 설정되어 있지 않은 컬럼과 상수와 직접 비교의 효율성을 향상시킵니다. 이런 경우 조건이 평가를 위해 스토리지 엔진에 "푸시 다운"됩니다. 이 최적화는 NDB
스토리지 엔진에서만 사용할 수 있습니다.
MySQL Cluster는 이러한 최적화를 통해 클러스터의 데이터 노드와 쿼리를 발행 한 MySQL Server간에 네트워크를 통해 일치하지 않는 행을 쓰기 필요성을 없앨 수 그것을 사용하는 경우 쿼리를 조건문 푸시 다운이 가능하더라도 사용하지 않는 경우보다 5 - 10 배 속도를 높일 수 있습니다.
MySQL Cluster 테이블이 다음과 같이 정의되어 있다고합니다.
CREATE TABLE t1 ( a INT, b INT, KEY (a) ) ENGINE = NDB;
조건문 푸시 다운은 인덱스가 설정되어 있지 않은 컬럼과 상수와 비교를 포함하여 여기에 나타낸 바와 같은 쿼리에서 사용할 수 있습니다.
SELECT a, b FROM t1 WHERE b = 10;
조건문 푸시 다운의 사용은 EXPLAIN
의 출력에서 확인할 수 있습니다.
mysql> EXPLAIN SELECT a,b FROM t1 WHERE b = 10\G
*************************** 1. row ******************** *******
id : 1
select_type : SIMPLE
table : t1
type : ALL
possible_keys : NULL
key : NULL
key_len : NULL
ref : NULL
rows : 10
Extra : Using where with pushed condition
그러나 조건문 푸시 다운은 이러한 두 개의 쿼리 중 하나와 함께 사용할 수 없습니다.
SELECT a, b FROM t1 WHERE a = 10; SELECT a, b FROM t1 WHERE b + 1 = 10;
컬럼 a
에 인덱스가 존재하기 때문에 조건문 푸시 다운은 첫 번째 쿼리에는 적용 할 수 없습니다. (인덱스 액세스 메소드가 효율적이기 때문에 조건문 푸시 다운보다 우선하여 선택됩니다.) 인덱스가 설정되어 있지 않은 컬럼 b
를 포함 비교는 간접적이기 때문에 두 번째 쿼리에 컨디션 푸시 다운을 채택 할 수 없습니다. (단, WHERE
절에서 b + 1 = 10
을 b = 9
에 감을 때 조건문 푸시 다운을 적용 할 수 있습니다.)
>
또는 <
연산자를 사용하여 인덱싱 된 열을 상수와 비교하는 경우에도 조건문 푸시 다운을 채택 할 수 있습니다.
mysql> EXPLAIN SELECT a, b FROM t1 WHERE a < 2\G
*************************** 1. row ******************** *******
id : 1
select_type : SIMPLE
table : t1
type : range
possible_keys : a
key : a
key_len : 5
ref : NULL
rows : 2
Extra : Using where with pushed condition
조건문 푸시 다운에서 지원되는 다른 비교에는 다음이 포함됩니다.
column
[NOT] LIKEpattern
pattern
은 일치하는 패턴을 포함하는 문자열 리터럴이어야합니다. 구문은 섹션 12.5.1 "문자열 비교 함수" 를 참조하십시오.column
IS [NOT] NULLcolumn
IN (value_list
)value_list
의 각 항목은 상수 리터럴 값이어야합니다.column
BETWEENconstant1
ANDconstant2
constant1
과constant2
는 각각 상수 리터럴 값이어야합니다.
이전 목록의 모든 경우에서 조건을 컬럼 및 상수와 하나 이상의 직접 비교 형식으로 변환 할 수 있습니다.
엔진 조건문 푸시 다운은 기본적으로 활성화됩니다. 서버를 시작할 때 그것을 해제하려면 optimizer_switch
시스템 변수를 설정합니다. 예를 들어, my.cnf
파일에 다음 줄을 사용합니다.
[mysqld] optimizer_switch = engine_condition_pushdown = off
실행시에 다음과 같이 조건문 푸시 다운을 사용합니다.
SET optimizer_switch = 'engine_condition_pushdown = off';
제한 엔진 조건문 푸시 다운에는 다음과 같은 제한이 있습니다.
조건문 푸시 다운은
NDB
스토리지 엔진에서만 지원됩니다.컬럼은 상수와 만 비교 할 수 있지만 여기에는 상수 값으로 평가되는 표현식도 포함되어 있습니다.
비교에 사용되는 컬럼은
BLOB
형 또는TEXT
형식 중 하나되어서는 안됩니다.컬럼과 비교되는 문자열 값은 컬럼과 같은 데이터 정렬을 사용해야합니다.
결합은 직접 지원되지 않습니다. 여러 테이블을 포함하는 조건은 가능한 경우에 개별적으로 적용됩니다. 실제로 푸시 다운되는 조건을 판단하려면
EXPLAIN EXTENDED
를 사용합니다.