So erhalten Sie Zählungen aus mehreren Verknüpfungen mit optimaler Effizienz
Bei Datenbankabfragen ist die Minimierung der Anzahl von Verknüpfungen entscheidend für die Leistung. Es kann jedoch Situationen geben, in denen es verlockend ist, mehrere Verknüpfungen gleichzeitig durchzuführen, um mehrere Zählungen zu erhalten. Lassen Sie uns ein Beispiel untersuchen und Optimierungsstrategien diskutieren.
Problemstellung
Die Aufgabe besteht darin, die Zeilen zu zählen, die von mehreren Joins auf demselben Primärschlüssel zurückgegeben werden. Ein unkomplizierter Ansatz besteht darin, für jeden Join individuelle Unterabfragen zu erstellen. Es stellt sich jedoch die Frage: Gibt es eine effizientere Möglichkeit, mit einer einzigen Abfrage das gleiche Ergebnis zu erzielen?
Erster Versuch
Ein Ansatz besteht darin, zu versuchen, die zu zählen Ergebnisse mehrerer Verknüpfungen mithilfe von Case-Anweisungen, wie unten gezeigt:
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
Diese Methode zählt jedoch die Gesamtzahl der Zeilen über alle verknüpften Tabellen hinweg, was zu Ergebnissen führt zu falschen Ergebnissen.
Optimierungslösung
Um die Abfrage zu optimieren und separate Zählungen für jeden Join zu erhalten, können Sie DISTINCT in einer einzelnen Abfrage nutzen. Für jede beteiligte Tabelle ist ein eindeutiger Schlüssel erforderlich, und die Spalte „idalb“ muss ein eindeutiger Schlüssel für die Albumtabelle sein. Die überarbeitete Abfrage lautet wie folgt:
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
In dieser Abfrage entfernt „distinct“ die Auswirkungen anderer Joins auf die Anzahl. Es ist jedoch wichtig zu bedenken, dass durch die Unterscheidung nicht zwangsläufig die Kosten für die Verknüpfungen entfallen. Wenn für alle (idAlb PrimaryKeyFields)-Felder der Tabellen abdeckende Indizes verfügbar sind, kann dieser Ansatz zu einer vergleichbaren Geschwindigkeit wie die ursprüngliche Lösung führen, bei der jeder Join separat durchgeführt wurde. Dennoch kann das Testen mit EXPLAIN dabei helfen, die optimale Strategie zu ermitteln.
Das obige ist der detaillierte Inhalt vonWie können Ergebnisse aus mehreren Datenbankverknüpfungen effizient gezählt werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!