8.2.1.8 IS NULL 최적화
MySQL은 col_name
=
constant_value
에 사용할 수있는 동일한 최적화를 col_name
IS NULL
에 대해서도 실행할 수 있습니다. 예를 들어, MySQL은 인덱스와 범위를 사용하여 IS NULL
을 포함 NULL
을 찾을 수 있습니다.
예 :
SELECT * FROMtbl_name
WHEREkey_col
IS NULL; SELECT * FROMtbl_name
WHEREkey_col
<=> NULL; SELECT * FROMtbl_name
WHEREkey_col
=const1
ORkey_col
=const2
ORkey_col
IS NULL;
WHERE
절에 NOT NULL
로 선언 된 컬럼 col_name
IS NULL
조건이 포함되어있는 경우, 그 수식은 최적화에 의해 제거됩니다. 이 최적화는 어쨌든 컬럼에서 NULL
이 생성 될 가능성이있는 경우에는 발생하지 않습니다. 예를 들어, LEFT JOIN
의 오른쪽 테이블에서 검색되는 경우입니다.
MySQL은 해결 된 하위 쿼리 일반적인 형태이다
의 조합을 최적화 할 수 있습니다. 이 최적화가 사용 된 경우 col_name
= expr
OR col_name
IS NULLEXPLAIN
에서 ref_or_null
로 표시됩니다.
이 최적화는 모든 키 부분에 대해서 하나의 IS NULL
을 처리 할 수 있습니다.
테이블 t2
의 컬럼 a
와 b
에 인덱스가 있다고하여, 최적화 된 쿼리의 몇 가지 예 :
SELECT * FROM t1 WHERE t1.a = expr
OR T1.A IS NULL;
SELECT * FROM t1, t2 WHERE t1.a = t2.a OR t2.a IS NULL;
SELECT * FROM t1, t2
WHERE (t1.a = t2.a OR t2.a IS NULL) AND t2.b = t1.b;
SELECT * FROM t1, t2
WHERE t1.a = t2.a AND (t2.b = t1.b OR t2.b IS NULL);
SELECT * FROM t1, t2
WHERE (t1.a = t2.a AND t2.a IS NULL AND ...)
OR (t1.a = t2.a AND t2.a IS NULL AND ...);
ref_or_null
먼저 참조 키 읽 다음 NULL
키 값이있는 행의 개별 검색을 실행합니다.
이 최적화는 하나의 IS NULL
레벨 밖에 처리 할 수 없습니다. 다음의 쿼리는 MySQL은 식 (t1.a=t2.a AND t2.a IS NULL)
에 대해서만 키 조회를 사용하여 b
에 대해서는 키 파트를 사용할 수 없습니다.
SELECT * FROM t1, t2 WHERE (t1.a = t2.a AND t2.a IS NULL) OR (t1.b = t2.b AND t2.b IS NULL);