최적의 효율성으로 여러 조인에서 개수를 가져오는 방법
데이터베이스 쿼리에서는 조인 수를 최소화하는 것이 성능에 매우 중요합니다. 그러나 여러 개수를 얻기 위해 한 번에 여러 조인을 수행하려는 유혹이 있는 시나리오가 있을 수 있습니다. 예를 살펴보고 최적화 전략에 대해 논의해 보겠습니다.
문제 설명
이 작업은 동일한 기본 키에 대한 여러 조인에 의해 반환된 행 수를 계산하는 것입니다. 간단한 접근 방식에는 각 조인에 대해 개별 하위 쿼리를 만드는 것이 포함됩니다. 그러나 단일 쿼리를 사용하여 동일한 결과를 얻는 더 효율적인 방법이 있습니까?
초기 시도
한 가지 접근 방식은 아래에 설명된 것처럼 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!