8.2.1.8 IS NULL 최적화
MySQL은 col_name = constant_value 에 사용할 수있는 동일한 최적화를 col_name IS NULL 에 대해서도 실행할 수 있습니다. 예를 들어, MySQL은 인덱스와 범위를 사용하여 IS NULL 을 포함 NULL 을 찾을 수 있습니다.
예 :
SELECT * FROMtbl_nameWHEREkey_colIS NULL; SELECT * FROMtbl_nameWHEREkey_col<=> NULL; SELECT * FROMtbl_nameWHEREkey_col=const1ORkey_col=const2ORkey_colIS 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);