이 최적화는 인덱싱되지 않은 열과 상수간 직접 비교의 효율성을 향상시킵니다. 이러한 경우 조건은 평가를 위해 스토리지 엔진에 "밀어 넣어집니다(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 출력을 사용하여 실제로 푸시 다운되는 조건을 판별합니다.
'Databases > MySQL' 카테고리의 다른 글
[MySQL] Multi-Range Read(다중범위 읽기) 최적화 (0) | 2020.08.04 |
---|---|
[MySQL] Index Condition Pushdown 최적화 (0) | 2020.08.02 |
[MySQL][Optimizer] Query 실행 계획 이해 (0) | 2020.07.31 |
[MySQL] insert into .. select from table 형태의 쿼리 사용시 주의 사항. (0) | 2020.07.30 |
[MySQL][Lock] LOCK TABLES 그리고 UNLOCK TABLES 문법 (0) | 2020.07.27 |