Ich habe eine SQL-Abfrage mit 4 UNIONS und 4 LEFT JOINS. Es ist so ausgelegt:
%Vor%Wäre es besser, 4 separate Abfragen auszuführen und die Ergebnisse anschließend mit php zusammenzuführen? Oder sollte ich sie zusammenhalten? Was würde diese schnellste Ausführung ermöglichen?
Die definitive Antwort ist, jede Methode zu testen, jedoch ist UNION
am wahrscheinlichsten schneller, da nur eine Abfrage von MySQL ausgeführt wird, im Gegensatz zu 4 für jeden Teil der Union.
Sie entfernen auch den Overhead des Lesens der Daten in den Speicher in PHP und verketten es. Stattdessen können Sie einfach ein while()
oder foreach()
oder was auch immer für ein Ergebnis tun.
Wenn eine Abfrage von einer Programmiersprache ausgeführt wird, treten die folgenden Schritte auf
Wenn Sie eine Anzahl von N Abfragen ausführen, treten die oben genannten Schritte N-mal auf, was Sie erraten können, wird den Prozess definitiv verlangsamen. Im Idealfall sollten wir die Anzahl der Anfragen so gering wie möglich halten.
Es wird Sinn machen, eine Abfrage in mehrere Teile aufzuteilen, wenn einzelne Abfragen komplex werden und es schwierig wird, sie zu warten, und die Ausführung viel Zeit in Anspruch nimmt. In diesem Fall wird es auch gut sein, die Abfrage selbst zu optimieren.
Wie in Ihrem Fall ist die Abfrage ziemlich einfach, und da jemand darauf hingewiesen hat, dass die union auch helfen wird, doppelte Zeilen zu entfernen, ist der beste Weg für sql query als php code zu gehen. Probieren Sie Optimierungstechniken wie das Erstellen von korrekten Indizes für Tabellen aus.
Die UNION-Klausel kann schneller sein, da distinct Datensätze gleichzeitig zurückgegeben werden (doppelte Datensätze werden nicht zurückgegeben), andernfalls müssen Sie dies in der Anwendung tun. Außerdem kann es in diesem Fall helfen, den Verkehr zu reduzieren.
Aus der Dokumentation:
Das Standardverhalten für UNION ist, dass doppelte Zeilen entfernt werden das Ergebnis. Das optionale DISTINCT-Schlüsselwort hat nur einen anderen Effekt als das Standard, weil es auch die Entfernung doppelter Zeilen angibt. Mit dem Optional ALL Schlüsselwort, doppelte Zeilenentfernung tritt nicht auf und der 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 eine beliebige ALL-Union überschreibt zu seiner Linken. Eine DISTINCT-Union kann explizit unter Verwendung von erzeugt werden UNION DISTINCT oder implizit durch Verwendung von UNION ohne folgende DISTINCT oder ALL Schlüsselwort.