Heim >Datenbank >MySQL-Tutorial >Wie können Ergebnisse aus mehreren Datenbankverknüpfungen effizient gezählt werden?

Wie können Ergebnisse aus mehreren Datenbankverknüpfungen effizient gezählt werden?

Barbara Streisand
Barbara StreisandOriginal
2024-12-08 16:11:10220Durchsuche

How to Efficiently Count Results from Multiple Database Joins?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn