다른 회사에서 상속 한 응용 프로그램의 느린 섹션을 리팩터링하여 다음과 같은 하위 쿼리 대신 내부 조인을 사용했습니다.
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은 더티 디테일을 줄 것입니다.
답변
조인은 인덱스에서 발생하지만 모든 행에 대해 하위 쿼리를 한 번 실행합니다 .
답변
답변
각 버전에서 Explain-plan을 실행하면 이유를 알려줍니다.
답변
쿼리가 데이터 집합에 대해 실행되기 전에 쿼리 최적화 프로그램을 통해 실행되며 최적화 프로그램은 가능한 빨리 결과 집합에서 많은 튜플 (행)을 제거 할 수있는 방식으로 쿼리를 구성하려고 시도합니다. 하위 쿼리 (특히 불량 쿼리)를 사용하는 경우 외부 쿼리 실행이 시작될 때까지 결과 집합에서 튜플을 제거 할 수없는 경우가 종종 있습니다.
쿼리를 보지 않으면 원본에 대해 나쁜 점을 말하기가 어렵지만 옵티마이 저가 훨씬 나아질 수 없었을 것입니다. ‘explain’을 실행하면 데이터 검색을위한 옵티 마이저 방법이 표시됩니다.
답변
각 쿼리에 대한 쿼리 계획을보십시오.
in 및 Join 은 일반적으로 동일한 실행 계획을 사용하여 구현할 수 있으므로 일반적으로 이들 간의 변경 속도가 전혀 없습니다.
답변
옵티마이 저는 잘하지 못했습니다. 일반적으로 차이없이 변환 할 수 있으며 옵티마이 저가이를 수행 할 수 있습니다.