[MySQL] Engine Condition Push Down 최적화

최적화는 인덱싱되지 않은 열과 상수간 직접 비교의 효율성을 향상시킵니다. 이러한 경우 조건은 평가를 위해 스토리지 엔진에 "밀어 넣어집니다(pushed down)". 최적화는 NDB 스토리지 엔진에서만 사용할 있습니다.

 

NDB 클러스터의 경우, 최적화를 통해 클러스터의 데이터 노드와 쿼리를 실행한 MySQL 서버 간에 네트워크를 통해 비매칭 행을 전송할 필요가 없으며, 조건 푸시다운이 가능하지만 사용되지 않는 경우보다 5~10 빠른 쿼리를 수행할 있습니다.

 

NDB 클러스터 테이블이 다음과 같이 정의되었다고 가정합니다.

CREATE TABLE t1 (
    a INT,
    b INT,
    KEY(a)
) ENGINE=NDB;

 

조건(condition) 푸시 다운은 여기에 표시된 것과 같은 쿼리에 사용할 있으며 여기에는 인덱스되지 않은 열과 상수 간의 비교가 포함됩니다.

SELECT a, b FROM t1 WHERE b = 10;

 

조건(Condition) 푸시 다운 사용은 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 열에 있으므로 조건 푸시 다운을 번째 쿼리에 적용 없습니다. (인덱스 액세스 방법이 효율적이므로 조건(Condition) 푸시 다운보다 우선적으로 선택됩니다.) 인덱스되지 않은 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

 

조건(Condition) 푸시 다운에 대해 지원되는 다른 비교는 다음과 같습니다.

+ column [NOT] LIKE pattern

pattern 일치시킬 패턴을 포함하는 문자열 리터럴이어야 합니다.

 

+ column IS [NOT] NULL

+ column IN (value_list)

value_list 항목은 상수 리터럴 값이어야합니다.

 

+ column BETWEEN constant1 AND constant2

constant1 constant2 각각 상수, 리터럴 값이어야합니다.

 

이전 목록의 모든 경우에서 조건이 열과 상수 사이의 하나 이상의 직접 비교 형식으로 변환될 있습니다.

 

엔진 조건(condition) 푸시 다운은 기본적으로 활성화되어 있습니다. 서버 시작시 이를 비활성화하려면 optimizer_switch 시스템 변수를 설정합니다. 예를 들어, my.cnf 파일에서 다음 행을 사용합니다.

[mysqld]

optimizer_switch=engine_condition_pushdown=off

 

런타임시 다음과 같이 조건(condition) 푸시 다운을 비활성화 합니다.

SET optimizer_switch='engine_condition_pushdown=off';

 

+ 한계. 엔진 상태(condition) 푸시 다운에는 다음 제한이 적용됩니다.

- 조건 푸시 다운은 NDB 스토리지 엔진에서만 지원됩니다.

- 컬럼은 상수만 비교될 있습니다. 그러나 여기에는 상수 값으로 평가되는 표현식이 포함됩니다.

- 비교에 사용된 컬럼은 BLOB 또는 TEXT 유형일 없습니다. 제외는 JSON, BIT ENUM 열까지 확장됩니다.

- 열과 비교할 문자열 값은 열과 동일한 데이터 정렬을 사용해야합니다.

- 조인은 직접 지원되지 않습니다. 여러 테이블과 관련된 조건은 가능한 경우 별도로 푸시됩니다. 확장된 EXPLAIN 출력을 사용하여 실제로 푸시 다운되는 조건을 판별합니다.

 

도움이 되셨다면 광고클릭 한번 부탁드립니다.

 

Designed by JB FACTORY