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
아니요, 옵티마이저가 잘못되었을 때만요.이는 데이터 분포가 심하게 치우치거나 제대로 계산할 수 없는 경우(예: 공간 또는 전체 텍스트 색인)일 수 있습니다.
언제 사용할지 어떻게 알 수 있나요?
통계를 수집하고, 두 가지 방법에 대한 계획을 세우고, 이러한 계획이 무엇을 의미하는지 이해해야 합니다.
이 경우:
자동으로 생성된 계획은 최적이 아니며 표준적인 방법으로 개선할 수 없습니다.
STRAIGHT_JOIN
버전이 더 낫습니다. 당신은 항상 그것이 왜 항상 그럴 것인지 이해하고 왜 항상 이해할 수 있습니다.
, 을 사용합니다.STRAIGHT_JOIN
.
언급URL : https://stackoverflow.com/questions/5818837/why-does-straight-join-so-drastically-improve-this-query-and-what-does-it-mean
'programing' 카테고리의 다른 글
끈에 0을 어떻게 채워요? (0) | 2022.12.10 |
---|---|
열의 JSON 데이터를 구문 분석할 수 있는 쿼리를 MySQL에서 어떻게 쓸 수 있습니까? (0) | 2022.12.10 |
Panda 데이터 프레임에서 열 수를 검색하려면 어떻게 해야 합니까? (0) | 2022.12.10 |
MySQL과 MariaDB 데이터베이스의 차이점은 무엇입니까? (0) | 2022.12.10 |
Java는 한때 Pair 클래스가 있지 않았나요? (0) | 2022.12.10 |