Sollten nicht vorbereitete Aussagen viel schneller sein?

7
%Vor%

sicher vorbereitete Aussagen sind viel sicherer aber auch überall wo es heißt, dass sie viel schneller sind ABER in meinem Test auf den obigen Code habe ich: - 2,45 Sekunden für vorbereitete Aussagen - 5.05 sec für das zweite Beispiel

Was denkst du, mache ich falsch? Sollte ich die zweite Lösung verwenden oder sollte ich versuchen, den PrepStmt zu optimieren?

    
silversky 13.04.2010, 00:15
quelle

4 Antworten

23

Was Sie falsch machen, ist, dass Sie die Anweisung tausendmal vorbereiten und jede vorbereitete Anweisung nur einmal ausführen. Sie sollten es einmal vorbereiten und tausend Mal ausführen.

    
Guffa 13.04.2010, 00:19
quelle
4

Es hat keinen Vorteil, eine Anweisung innerhalb einer Schleife für eine einzelne Ausführung vorzubereiten. Sie fügen nur Overhead hinzu. Verwenden Sie vorbereitete Anweisungen für Abfragen, die Sie in der Regel wiederholt mit unterschiedlichen Parametern ausführen.

    
dkretz 13.04.2010 00:18
quelle
2

@silversy -

Schleifengrundlagen 101 (oder einfache Codierung 101): Schleifeninvarianten Code aus den Schleifen entfernen. Warum würden Sie die Anweisung in der Schleife vorbereiten, wenn es keine Parameter benötigt, die von der Schleife selbst abhängig sind?

Natürlich wird es Gonaden saugen, wenn Sie vorbereitete Anweisungen verwenden, wenn Sie sie mit jeder Schleifeniteration vorbereiten. Der Overhead, den Sie beobachten, besteht darin, dass die Anweisung zuerst vorbereitet wird und nicht in ihrer Ausführung.

Wiederholen Sie Ihren Code wie folgt und versuchen Sie es erneut:

%Vor%

Der Vorbehalt hier besteht jedoch darin, dass der Unterschied zwischen einer vorbereiteten Anweisung und einer nicht vorbereiteten als Rechenzeit für die Ausführung der Abfrage und das Abrufen der Daten werden groß.

Nur um einige fiktive Zahlen aus meinem @@@ um der Illustration willen zu ziehen:

Sagen Sie, dass die Abfrage selbst und das Abrufen der Daten 0,01 Sekunden dauert (nennen Sie dies A). Stellen Sie sich außerdem vor, dass die Konstruktion und Ausführung des Codes hinter einer vorbereiteten Anweisung 0,01 Sekunden (X) und für die unvorbereitete Abfrage 0,05 Sekunden oder 5 * 0,01 Sekunden (Y = 5 * X) dauert. Das Verhältnis zwischen dem vorbereiteten und dem nicht vorbereiteten Code wäre:

%Vor%

Nehmen wir an, dass für eine andere Abfrage die Abrufzeit (aufgrund des Datenvolumens oder des Netzwerkdurchsatzes) 10 Sekunden beträgt (1000 * 0,01 Sekunden). Dann ändert sich das Verhältnis

%Vor%

Sie sind ziemlich ununterscheidbar. Was ich versuche zu sagen, ist, dass vorbereitete Aussagen schneller sind (und dass Sie sie verwenden sollten), ABER der Test, den Sie implementieren, ist nicht unbedingt ein guter Weg, das herauszufinden oder ihren Wert zu messen. Sie müssen andere Faktoren berücksichtigen, um wirklich die Leistung zu messen, die Sie ausdrücken.

    
luis.espinal 13.04.2010 00:49
quelle
1

Zusätzlich zu den obigen Antworten ...

Ich sehe, Sie verwenden MySQL und unten ist der Link von dort zu vorbereiteten Aussagen: Ссылка

Ein Auszug von dort:

Die Leistungssteigerung in vorbereiteten Anweisungen kann aus ein paar verschiedenen Funktionen resultieren. Erstens muss die Abfrage nur einmal analysiert werden. Wenn Sie die Anweisung zum ersten Mal vorbereiten, analysiert MySQL die Anweisung, um die Syntax zu überprüfen und die auszuführende Abfrage einzurichten. Wenn Sie die Abfrage dann mehrmals ausführen, wird der Overhead nicht mehr benötigt. Diese vorbereitende Analyse kann zu einer Erhöhung der Geschwindigkeit führen, wenn Sie dieselbe Abfrage mehrmals ausführen müssen.

    
Romain Hippeau 13.04.2010 00:35
quelle