Bei der Verwendung von PHP und MySQL für Datenbankvorgänge haben viele Entwickler möglicherweise ein Problem gestoßen: Bei der Ausführung mehrerer SQL -Anweisungen ist MySQLI :: Next_Result () erforderlich, und diese Funktion wird häufig in Frage gestellt "verlangsamt die Abfragegeschwindigkeit"? Heute werden wir die Vor- und Nachteile dieses Problems untersuchen, um Ihnen zu helfen, die Wahrheit zu verstehen.
Bei der Ausführung mehrerer SQL -Anweisungen mit MySQLI_Multi_query () müssen die Ergebnisse jeder Anweisung manuell verarbeitet werden. Zu diesem Zeitpunkt besteht die Funktion von Next_Result () darin, den internen Zeiger auf den Ergebnissatz der nächsten SQL -Anweisung zu verschieben:
$conn = new mysqli("localhost", "user", "password", "database");
$sql = "SELECT * FROM users; SELECT * FROM orders;";
if ($conn->multi_query($sql)) {
do {
if ($result = $conn->store_result()) {
while ($row = $result->fetch_assoc()) {
print_r($row);
}
$result->free();
}
} while ($conn->next_result());
}
Next_Result () führt nicht im Wesentlichen eine Abfrage aus , sondern teilt dem MySQLI -Client mit, dass "das nächste Ergebnis vom Server erzielt werden kann". Der Hauptzeitkonsum kommt von:
Netzwerklatenz (Client-Server-Kommunikation)
Großes Datenvolumen (der Speicher wird verbraucht, wenn das Ergebnissatz groß ist)
Nicht wesentliche Verarbeitung (unverarbeitete Ergebnisse müssen auch gereinigt werden)
Wenn Ihre Abfrage selbst bereits schnell ist, ist der Anruf bei Next_Result () fast vernachlässigbar. Wenn die Abfrage jedoch eine große Datenmenge erzeugt, bedeutet jeder Umzug des Ergebnissatzes, dass das vorherige Ergebnis analysiert und freigegeben werden muss, was tatsächlich zusätzlichen Aufwand entstehen kann.
Angenommen, wir führen die folgende Multiquery-Anweisung im Test aus:
$sql = "
SELECT * FROM big_table_1;
SELECT * FROM big_table_2;
SELECT * FROM big_table_3;
";
Das Datenvolumen für jede Tabelle beträgt rund 50.000 Zeilen.
Wir führen zwei Testsätze aus:
A: Verwenden Sie multi_query () + next_result () , um jedes Ergebnis normal zu analysieren;
B: Verwenden Sie Multi_Query () , aber nur das erste Ergebnis wird genommen, und der Rest wird ignoriert.
Die Statistiken sind wie folgt (in Sekunden):
Modell | Ausführungszeit |
---|---|
A | 0,82s |
B | 0,48s |
Wie Sie sehen können, ist es schneller, wenn Sie das nachfolgende Ergebnissatz nicht benötigen, wenn Sie Next_Result () wirklich nicht anrufen. Aber solange Sie diese Daten erhalten müssen, ist sie unverzichtbar.
Wenn Sie nur das Abfrageergebnis einer Anweisung benötigen, versuchen Sie , multi_query () zu vermeiden:
// Weitere empfohlene Weise
$result = $conn->query("SELECT * FROM users");
Steuern Sie bei Verwendung von Multi_Query () die Datenmenge, die von jeder Abfrageanweisung so weit wie möglich zurückgegeben werden. Wählen Sie beispielsweise nur die erforderlichen Felder aus oder verwenden Sie die Grenze , um die Nummer zu begrenzen:
SELECT id, name FROM users LIMIT 100;
Nennen Sie $ $ result-> Free () nach store_result () , um die Speicherakkumulation zu verhindern, insbesondere wenn sie in Schleifen verwendet werden.
Next_result () selbst "verlangsamen die Abfrage nicht", sondern nur ein Teil des Prozesses;
Was die Geschwindigkeit wirklich beeinflusst, ist die Datenmenge und ob Sie wirklich alle Ergebnisse benötigen.
Wenn Sie nur eine Abfrage benötigen, vermeiden Sie bitte multi_query () .
Wenn Sie mehrere Ergebnisverarbeitung benötigen, ist Next_Result () Ihr guter Helfer.
Weitere eingehende Leistungsanalysen finden Sie in unserem detaillierten Vergleichsbericht unter https://gitbox.net/articles/db-performance .