programing

STRAY_JOIN이 이 쿼리를 대폭 개선하는 이유는 무엇이며 SELECT 키워드 뒤에 쓰여지는 것은 무엇을 의미합니까?

minecode 2022. 12. 10. 10:57
반응형

STRAY_JOIN이 이 쿼리를 대폭 개선하는 이유는 무엇이며 SELECT 키워드 뒤에 쓰여지는 것은 무엇을 의미합니까?

다음 MySql 쿼리가 있습니다.

select t1.*
from Table1 t1
inner join Table2 t2
on t1.CommonID = t2.CommonID
where t1.FilterID = 1

실행하는데 약 30초가 소요되는데 이상했습니다. 왜냐하면 join이나 where 절을 코멘트하면 1초도 걸리지 않기 때문입니다.

select t1.*
from Table1 t1
where t1.FilterID = 1

또는

select t1.*
from Table1 t1
inner join Table2 t2
on t1.CommonID = t2.CommonID

각각 1초도 걸리지 않습니다.

다음으로 STRAY_JOIN 키워드가 있습니다.이 키워드는 http://dev.mysql.com/doc/refman/5.0/en/join.html 에서 참조할 수 있습니다.

STRAY_JOIN은 왼쪽 테이블이 항상 오른쪽 테이블보다 먼저 읽힌다는 점을 제외하고는 JOIN과 유사합니다.이것은 조인 옵티마이저가 테이블을 잘못된 순서로 배치하는 경우에 사용할 수 있습니다.

뭐? 난 쓸 수 있어

select t1.*
from Table1 t1
STRAIGHT_JOIN  Table2 t2
on t1.CommonID = t2.CommonID
where t1.FilterID = 1

쿼리는 1초 이내에 실행됩니다.

심지어 낯선 사람도 쓸 수 있다.

select STRAIGHT_JOIN  t1.*
from Table1 t1
inner join Table2 t2
on t1.CommonID = t2.CommonID
where t1.FilterID = 1

1초도 안 걸리고 이 구문은 합법적이지도 않은 것 같아요

두 번째 예시는 INSER JOIN이 작성될 때마다 STRAYT_JOIN이 사용된다는 의미라고 생각합니다만, 그 문서를 찾을 수 없습니다.

여기서 무슨 일이 일어나고 있으며, 어떻게 하면 "가입 옵티마이저"로 인해 상대적으로 성능이 저하될 수 있을까요?항상 STRAY_JOIN을 사용해야 하나요?언제 사용할지 어떻게 알 수 있나요?

표 1과 표 2는 모두 정수 프라이머리 키를 가지고 있습니다.필터ID는 다른 테이블의 외부 키입니다.Common은ID 열은 둘 다 세 번째 테이블의 외부 키입니다.둘 다 색인이 있어요데이터베이스 엔진은 InnoDB입니다.

감사해요.

여기서 무슨 일이 일어나고 있으며, 어떻게 하면 "가입 옵티마이저"로 인해 상대적으로 성능이 저하될 수 있을까요?

STRAIGHT_JOIN테이블 결합 순서를 강제하기 때문에table1외부 루프에서 스캔됩니다.table2내부 루프에 있습니다.

최적기는 완벽하지 않으며(아직 꽤 괜찮은 수준이지만), 가장 가능성이 높은 원인은 오래된 통계량입니다.

항상 사용해야 합니까?STRAIGHT_JOIN

아니요, 옵티마이저가 잘못되었을 때만요.이는 데이터 분포가 심하게 치우치거나 제대로 계산할 수 없는 경우(예: 공간 또는 전체 텍스트 색인)일 수 있습니다.

언제 사용할지 어떻게 알 수 있나요?

통계를 수집하고, 두 가지 방법에 대한 계획을 세우고, 이러한 계획이 무엇을 의미하는지 이해해야 합니다.

이 경우:

  1. 자동으로 생성된 계획은 최적이 아니며 표준적인 방법으로 개선할 수 없습니다.

  2. STRAIGHT_JOIN버전이 더 낫습니다. 당신은 항상 그것이 왜 항상 그럴 것인지 이해하고 왜 항상 이해할 수 있습니다.

, 을 사용합니다.STRAIGHT_JOIN.

언급URL : https://stackoverflow.com/questions/5818837/why-does-straight-join-so-drastically-improve-this-query-and-what-does-it-mean

반응형