9 Stimmen

Ist es besser, eine UNION in SQL durchzuführen oder separate Abfragen zu verwenden und dann php array_merge zu verwenden?

Ich habe eine SQL-Abfrage, die 4 UNIONS und 4 LEFT JOINS enthält. Es ist folgendermaßen aufgebaut:

SELECT ... FROM tabelle1
    LEFT JOIN andere_tabelle1
UNION SELECT ... FROM tabelle2
    LEFT JOIN andere_tabelle2
UNION SELECT ... andere_tabelle3
    LEFT JOIN andere_tabelle3
UNION SELECT ... FROM tabelle4
    LEFT JOIN andere_tabelle4

Wäre es besser, 4 separate Abfragen auszuführen und die Ergebnisse nachträglich mit PHP zusammenzuführen? Oder sollte ich sie zusammenhalten? Welches würde die schnellste Ausführung bieten?

5voto

Bojangles Punkte 95745

Die definitive Antwort besteht darin, jeden Methode zu testen, aber das UNION ist wahrscheinlich schneller, da nur eine Abfrage von MySQL ausgeführt wird im Gegensatz zu 4 für jedes Teil der Union.

Sie entfernen auch den Overhead des Lesens der Daten in den Speicher in PHP und deren Verknüpfung. Stattdessen können Sie einfach ein while() oder foreach() oder was auch immer auf einem Ergebnis durchführen.

0voto

sundar Punkte 1750

In diesem Fall hängt es davon ab, wie viele Datensätze Sie aus dem Ergebnis erhalten. Da Sie in allen Unions einen Left Join verwenden, schlage ich vor, unterschiedliche Fetches durchzuführen, um Engpässe in SQL zu vermeiden und die Ergebnisse in PHP zusammenzuführen.

0voto

Devart Punkte 114874

Die UNION-Klausel kann schneller sein, weil sie sofort unterschiedliche Datensätze zurückgibt (doppelte Datensätze werden nicht zurückgegeben), andernfalls müssten Sie es in der Anwendung tun. In diesem Fall kann es auch dazu beitragen, den Datenverkehr zu reduzieren.

Aus der Dokumentation:

Das Standardverhalten für UNION besteht darin, dass doppelte Zeilen aus dem Ergebnis entfernt werden. Das optionale DISTINCT-Stichwort hat keine Wirkung außer dem Standardverhalten, da es auch das Entfernen von doppelten Zeilen angibt. Mit dem optionalen ALL-Stichwort tritt kein Entfernen von doppelten Zeilen auf und das Ergebnis enthält alle übereinstimmenden Zeilen aus allen SELECT-Anweisungen.

Sie können UNION ALL und UNION DISTINCT in derselben Abfrage mischen. Gemischte UNION-Typen werden so behandelt, dass eine DISTINCT-Union jede ALL-Union zu ihrer Linken überschreibt. Eine DISTINCT-Union kann explizit mit UNION DISTINCT oder implizit durch Verwendung von UNION ohne nachfolgendes DISTINCT- oder ALL-Stichwort erzeugt werden.

0voto

Kamal Punkte 5429

Wenn eine Abfrage aus einer Programmiersprache ausgeführt wird, treten folgende Schritte auf

  1. Es wird eine Verbindung zwischen Anwendung und Datenbank hergestellt (oder eine vorhandene Verbindung aus dem Pool verwendet)
  2. Die Abfrage wird an die Datenbank gesendet
  3. Die Datenbank sendet das Ergebnis zurück
  4. Die Verbindung wird dem Pool freigegeben

Wenn Sie N Abfragen ausführen, geschehen die obigen Schritte N Mal, was definitiv den Vorgang verlangsamen wird. Daher sollten wir idealerweise die Anzahl der Abfragen so gering wie möglich halten.

Es macht Sinn, eine Abfrage in mehrere Teile aufzuteilen, wenn eine einzelne Abfrage komplex wird und es schwierig wird, sie zu pflegen und sie lange dauert, um ausgeführt zu werden. In diesem Fall ist es auch ratsam, die Abfrage selbst zu optimieren.

In Ihrem Fall ist die Abfrage ziemlich einfach, und wie bereits erwähnt wurde, wird die Verwendung von UNION auch dazu beitragen, Duplikate zu entfernen. Der beste Weg ist also, sich für eine SQL-Abfrage anstelle von PHP-Code zu entscheiden. Versuchen Sie Optimierungstechniken wie das Erstellen geeigneter Indizes auf Tabellen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X