[sql] 하위 쿼리와 조인

다른 회사에서 상속 한 응용 프로그램의 느린 섹션을 리팩터링하여 다음과 같은 하위 쿼리 대신 내부 조인을 사용했습니다.

WHERE id IN (SELECT id FROM ...)

리팩토링 된 쿼리는 약 100 배 빠르게 실행됩니다. (~ 50 초 ~ ~ 0.3) 개선이 필요했지만 왜 그렇게 과감했는지 설명 할 수 있습니까? where 절에 사용 된 열은 모두 색인화되었습니다. SQL은 where 절에서 행마다 한 번씩 쿼리를 실행합니까?

업데이트 -결과 설명 :

차이점은 “where id in ()”쿼리의 두 번째 부분에 있습니다.

2   DEPENDENT SUBQUERY  submission_tags ref st_tag_id   st_tag_id   4   const   2966    Using where

조인이있는 1 개의 색인 행 :

    SIMPLE  s   eq_ref  PRIMARY PRIMARY 4   newsladder_production.st.submission_id  1   Using index



답변

“상관 된 하위 쿼리”(즉, 포함하는 쿼리의 행에서 얻은 값에 따라 where 조건이 달라지는 쿼리)는 각 행마다 한 번씩 실행됩니다. 상관되지 않은 하위 쿼리 (where 조건이 포함하는 쿼리와 독립적 인 쿼리)는 처음에 한 번 실행됩니다. SQL 엔진은이 구별을 자동으로 만듭니다.

그러나, 그렇습니다. Explain-plan은 더티 디테일을 줄 것입니다.


답변

조인은 인덱스에서 발생하지만 모든 행에 대해 하위 쿼리를 한 번 실행합니다 .


답변

다음 은 MySQL 6.0에서 하위 쿼리를 평가 하는 방법에 대한 예입니다 .

새로운 옵티마이 저는 이런 종류의 하위 쿼리를 조인으로 변환합니다.


답변

각 버전에서 Explain-plan을 실행하면 이유를 알려줍니다.


답변

쿼리가 데이터 집합에 대해 실행되기 전에 쿼리 최적화 프로그램을 통해 실행되며 최적화 프로그램은 가능한 빨리 결과 집합에서 많은 튜플 (행)을 제거 할 수있는 방식으로 쿼리를 구성하려고 시도합니다. 하위 쿼리 (특히 불량 쿼리)를 사용하는 경우 외부 쿼리 실행이 시작될 때까지 결과 집합에서 튜플을 제거 할 수없는 경우가 종종 있습니다.

쿼리를 보지 않으면 원본에 대해 나쁜 점을 말하기가 어렵지만 옵티마이 저가 훨씬 나아질 수 없었을 것입니다. ‘explain’을 실행하면 데이터 검색을위한 옵티 마이저 방법이 표시됩니다.


답변

각 쿼리에 대한 쿼리 계획을보십시오.

inJoin일반적으로 동일한 실행 계획을 사용하여 구현할 수 있으므로 일반적으로 이들 간의 변경 속도가 전혀 없습니다.


답변

옵티마이 저는 잘하지 못했습니다. 일반적으로 차이없이 변환 할 수 있으며 옵티마이 저가이를 수행 할 수 있습니다.