Mysql
 sql >> Base de données >  >> RDS >> Mysql

un décompte pour chaque jointure - optimisation

À des fins d'optimisation, une bonne règle de base consiste à rejoindre moins, pas plus. En fait, vous devriez essayer de joindre le moins de lignes possible avec le moins de lignes possible. Avec toute jointure supplémentaire, vous multiplierez les coûts au lieu d'ajouter des coûts. Parce que mysql générera simplement une grande matrice multipliée. Une grande partie de cela est optimisée par les index et d'autres éléments.

Mais pour répondre à votre question :il est en fait possible de compter avec une seule grande jointure, en supposant que les tables ont des clés uniques et que idalb est une clé unique pour l'album. Ensuite, et seulement alors, vous pouvez le faire de la même manière que votre code :

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

où PrimaryKeyFields représente les champs de clé primaire des tables jointes (vous devez les rechercher).

Distinct supprimera l'effet des autres jointures sur le décompte. Mais malheureusement, en général, distinct ne supprimera pas l'effet des jointures sur le coût.

Bien que, si vous avez des index qui couvrent tous les champs (idAlb + PrimaryKeyFields) de vos tables, cela pourrait même être aussi rapide que la solution d'origine (car il peut optimiser le distinct pour ne pas faire de tri) et se rapprochera de ce à quoi vous pensiez (il suffit de parcourir chaque table/index une fois). Mais dans un scénario normal ou dans le pire des cas, il devrait fonctionner moins bien qu'une solution raisonnable (comme celle de SlimGhost) - car il est peu probable qu'il trouve la stratégie optimale. Mais jouez avec et vérifiez les explications (et publiez les résultats), peut-être que mysql fera quelque chose de fou.