>데이터 베이스 >MySQL 튜토리얼 >여러 데이터베이스 조인의 결과를 효율적으로 계산하는 방법은 무엇입니까?

여러 데이터베이스 조인의 결과를 효율적으로 계산하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-08 16:11:10225검색

How to Efficiently Count Results from Multiple Database Joins?

최적의 효율성으로 여러 조인에서 개수를 가져오는 방법

데이터베이스 쿼리에서는 조인 수를 최소화하는 것이 성능에 매우 중요합니다. 그러나 여러 개수를 얻기 위해 한 번에 여러 조인을 수행하려는 유혹이 있는 시나리오가 있을 수 있습니다. 예를 살펴보고 최적화 전략에 대해 논의해 보겠습니다.

문제 설명

이 작업은 동일한 기본 키에 대한 여러 조인에 의해 반환된 행 수를 계산하는 것입니다. 간단한 접근 방식에는 각 조인에 대해 개별 하위 쿼리를 만드는 것이 포함됩니다. 그러나 단일 쿼리를 사용하여 동일한 결과를 얻는 더 효율적인 방법이 있습니까?

초기 시도

한 가지 접근 방식은 아래에 설명된 것처럼 Case 문을 사용한 여러 조인의 결과:

select alb.titreAlb as "Titre",
sum(case when alb.idAlb=payalb.idAlb then 1 else 0 end) "Pays",
sum(case when alb.idAlb=peralb.idAlb then 1 else 0 end) "Personnages",
sum(case when alb.idAlb=juralb.idAlb then 1 else 0 end) "Jurons"
from album alb
left join pays_album payalb using ( idAlb )
left join pers_album peralb using ( idAlb )
left join juron_album juralb using ( idAlb )
where alb.titreAlb = "LES CIGARES DU PHARAON"
group by alb.titreAlb

그러나 이 방법은 전체 행의 총 개수를 계산합니다. 모든 조인된 테이블이 잘못된 결과를 초래합니다.

최적화 솔루션

쿼리를 최적화하고 각 조인에 대해 별도의 개수를 얻으려면 단일 쿼리에서 DISTINCT를 활용할 수 있습니다. 관련된 각 테이블에는 고유 키가 필요하며 idalb 열은 앨범 테이블에 대한 고유 키여야 합니다. 수정된 쿼리는 다음과 같습니다.

select alb.titreAlb as "Titre",
count(distinct payalb.idAlb, payalb.PrimaryKeyFields) "Pays",
count(distinct peralb.idAlb, peralb.PrimaryKeyFields) "Personnages",
count(distinct juralb.idAlb, juralb.PrimaryKeyFields) "Jurons"
from album alb
left join pays_album payalb using ( idAlb )
left join pers_album peralb using ( idAlb )
left join juron_album juralb using ( idAlb )
where alb.titreAlb = "LES CIGARES DU PHARAON"
group by alb.titreAlb

이 쿼리에서 discover는 다른 조인이 개수에 미치는 영향을 제거합니다. 그러나 구별이 반드시 조인 비용을 제거하는 것은 아니라는 점을 기억하는 것이 중요합니다. 테이블의 모든 (idAlb PrimaryKeyFields) 필드에 대해 포함 인덱스를 사용할 수 있는 경우 이 접근 방식은 각 조인이 별도로 수행된 원래 솔루션과 비슷한 속도를 제공할 수 있습니다. 그럼에도 불구하고 EXPLAIN을 사용한 테스트는 최적의 전략을 결정하는 데 도움이 될 수 있습니다.

위 내용은 여러 데이터베이스 조인의 결과를 효율적으로 계산하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.