Comment obtenir le nombre de jointures multiples avec une efficacité optimale
Dans les requêtes de base de données, minimiser le nombre de jointures est crucial pour les performances. Cependant, il peut y avoir des scénarios dans lesquels il peut être tentant d'effectuer plusieurs jointures à la fois pour obtenir plusieurs décomptes. Explorons un exemple et discutons des stratégies d'optimisation.
Énoncé du problème
La tâche consiste à compter les lignes renvoyées par plusieurs jointures sur la même clé primaire. Une approche simple consiste à créer des sous-requêtes individuelles pour chaque jointure. Cependant, la question se pose : existe-t-il un moyen plus efficace d'obtenir le même résultat en utilisant une seule requête ?
Tentative initiale
Une approche consiste à tenter de compter le résultats de plusieurs jointures à l'aide d'instructions case, comme démontré ci-dessous :
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
Cependant, cette méthode compte le nombre total de lignes dans toutes les tables jointes, ce qui entraîne dans des résultats incorrects.
Solution d'optimisation
Pour optimiser la requête et obtenir des décomptes séparés pour chaque jointure, vous pouvez exploiter DISTINCT dans une seule requête. Une clé unique est requise pour chaque table impliquée, et la colonne idalb doit être une clé unique pour la table album. La requête révisée est la suivante :
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
Dans cette requête, distinct supprime les effets des autres jointures sur le décompte. Cependant, il est important de garder à l’esprit que distinct n’élimine pas nécessairement le coût des jointures. Si des index de couverture sont disponibles pour tous les champs (idAlb PrimaryKeyFields) des tables, cette approche pourrait donner une vitesse comparable à la solution d'origine, où chaque jointure était effectuée séparément. Néanmoins, tester avec EXPLAIN peut aider à déterminer la stratégie optimale.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!