책너두 6기 44일차
백은빈, 이성욱의 Real MySQL 8.0 1권 p.458 ~ p.465
내용정리
10 실행계획
10.3 실행계획분석
10.3.12 Extra 칼럼
10.3.12.4 FirstMatch
FirstMatch 전략이 사용되면 출력된다.
10.3.12.5 Full scan on NULL key
SQL 표준에서는 NULL
을 “알 수 없는 값”으로 정의하고 있으며, NULL
에 대한 연산의 규칙까지 정의하고 있다. 연산을 수행하기 위해 이 조건은 다음과 같이 비교돼야 한다.
- 서브쿼리가 1건이라도 결과 레코드를 가진다면 최종 비교 결과는
NULL
- 서브쿼리가 1건도 결과 레코드를 가지지 않는다면 최종 비교 결과는
FALSE
10.3.12.6 Impossible HAVING
쿼리에 사용된 HAVING
절의 조건을 만족하는 레코드가 없을 때 실행 계획의 Extra
칼럼에는 “Impossible HAVING” 키워드가 표시된다.
10.3.12.7 Impossible WHERE
위와 비슷하게, WHERE
조건이 항상 FALSE
가 될 수밖에 없는 경우 “Impossible WHERE”가 표시된다.
10.3.12.8 LooseScan
LooseScan 최적화 전략이 사용되면 표시
10.3.12.9 No matching min/max row
쿼리의 WHERE
조건절을 만족하는 레코드가 한 건도 없는 경우 일반적으로 “Impossible WHERE …“문장이 Extra
칼럼에 표시된다. MIN()
이나 MAX()
와 같은 집합 함수가 있는 쿼리의 조건절에 일치하는 레코드가 한 건도 없을때는 이 표시가 출력된다.
10.3.12.10 no matching row in const table
조인에 사용된 테이블에서 const 방법으로 접근할 때 일치하는 레코드가 없다면 표시
10.3.12.11 No matching rows after partition pruning
파티션된 테이블에 대한 UPDATE
또는 DELETE
명령의 실행 계획에서, 해당 파티션에서 UPDATE
하거나 DELETE
할 대상 레코드가 없을 떄 표시
10.3.12.12 No tables used
FROM
절이 없는 쿼리 문장이나 "FROM DUAL"
형태의 쿼리 실행 계획에서는 Extra
칼럼에 “No tables used”라는 메시지가 출력된다.
10.3.12.13 Not exists
A 테이블에는 존재하지만 B 테이블에는 없는 값을 조회해야 하는 쿼리를 사용할 때, NOT IN(subquery)
형태나 NOT EXISTS
연산자를 주로 사용한다. 이러한 형태의 조인을 안티-조인(Anti-JOIN)이라고도 한다. 똑같은 처리를 아우터 조인(LEFT OUTER JOIN
)을 이용해서도 구현할 수 있다. 일반적으로 NOT IN(subquery)
이나 NOT EXISTS
등의 연산자를 사용하는 안티-조인으로 처리해야 하지만 레코드의 건수가 많을 때는 아우터 조인을 이용하면 빠른 성능을 낼 수 있다. 아우터 조인을 이용해 안티-조인을 수행하는 쿼리에서는 실행 계획의 Extra
칼럼에 “nOT EXISTS” 메시지가 표시된다.