Mysql
 sql >> Datenbank >  >> RDS >> Mysql

eine Zählung für jeden Join - Optimierung

Für Optimierungszwecke lautet eine gute Faustregel, weniger zu verbinden, nicht mehr. Tatsächlich sollten Sie versuchen, so wenige Zeilen wie möglich mit so wenigen Zeilen wie möglich zu verbinden. Mit jedem zusätzlichen Beitritt multiplizieren Sie die Kosten, anstatt die Kosten hinzuzufügen. Weil mysql im Grunde nur eine große multiplizierte Matrix generiert. Vieles davon wird jedoch durch Indizes und andere Dinge optimiert.

Aber um Ihre Frage zu beantworten:Es ist tatsächlich möglich, mit nur einem großen Join zu rechnen, vorausgesetzt, die Tabellen haben eindeutige Schlüssel und idalb ist ein eindeutiger Schlüssel für das Album. Dann, und nur dann, können Sie es ähnlich wie in Ihrem Code machen:

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

wobei PrimaryKeyFields für die Primärschlüsselfelder der verknüpften Tabellen steht (Sie müssen sie nachschlagen).

Distinct entfernt den Effekt, den die anderen Joins auf die Zählung haben. Aber leider im Allgemeinen distinct wird die Auswirkungen der Joins auf die Kosten nicht beseitigen.

Wenn Sie jedoch Indizes haben, die alle (idAlb + PrimaryKeyFields)-Felder Ihrer Tabellen abdecken, ist dies möglicherweise sogar so schnell wie die ursprüngliche Lösung (weil sie den distinct optimieren kann um keine Sortierung vorzunehmen) und kommt dem nahe, woran Sie gedacht haben (einfach einmal durch jede Tabelle/jeden Index gehen). Aber in einem normalen oder Worst-Case-Szenario sollte es schlechter abschneiden als eine vernünftige Lösung (wie die von SlimGhost) - weil es zweifelhaft ist, dass es die optimale Strategie findet. Aber spielen Sie damit herum und überprüfen Sie die Erklärungen (und posten Sie die Ergebnisse), vielleicht macht mysql etwas Verrücktes.