Frage

I durch eine Reihe von Werten (1 bis 100 zum Beispiel) am Looping und eine vorbereitete Anweisung in der Schleife ausgeführt wird.

Sie haben und nutzen, um eine Transaktion mit - zu begehen, nachdem die Schleife endet - im Vergleich zu einer direkten Ausführung innerhalb der Schleife

Die Werte nicht voneinander abhängig sind, so wird eine Transaktion nicht aus dieser Sicht erforderlich ist.

War es hilfreich?

Lösung

Wenn Ihre Abfragen sind Einfügungen, die Seite 7.2.19 . Geschwindigkeit von INSERT-Anweisungen das MySQL-Handbuch gibt zwei interessante Informationen, abhängig davon, ob eine transactionnal Engine verwenden oder nicht:

Bei Verwendung eines nicht-transactionnal Motors:

  

INSERT-Operationen zu beschleunigen, die   mit mehreren Anweisungen durchgeführt für   nichttransaktionale Tabellen sperren   Tabellen.

     

Das kommt die Leistung, da die   Indexpuffer wird auf die Festplatte geschrieben nur   einmal, nachdem alle INSERT-Anweisungen haben   vollendet, fertiggestellt. Normalerweise würde es als   viele Indexpuffer Wallungen, da es   INSERT-Anweisungen. explizite Verriegelungs   Aussagen sind nicht erforderlich, wenn Sie können   einfügen, um alle Zeilen mit einem einzigen INSERT.

Und mit einem transactionnal Motor:

  

Um schnelle Einfügungen zu erhalten für   transaktionalen Tabellen, die Sie verwenden sollten   START TRANSACTION und COMMIT statt   von LOCK TABLES.

Also ich bin zu raten, Transaktionen könnte eine gute Idee sein - aber ich nehme an, dass auf der Last auf dem Server verlassen konnte, und ob es mehrere Anwendungen die gleiche Tabelle im selben Moment mit, und alles, was ...

Es gibt weitere Informationen auf der Seite ich verbunden, so zögern Sie nicht, es zu lesen; -)


Und wenn Sie tun Update-Anweisungen :

  

Eine weitere Möglichkeit, schnell Updates zu erhalten ist,   viele Updates verzögern Updates und dann tun   in Folge später. Falls mehrere   Updates zusammen ist viel schneller als   tut ein zu einer Zeit, wenn Sie die Sperre   Tabelle.

Also, ich bin das gleiche raten kann, als für Einsätze gesagt werden.


BTW: sicher sein, können Sie beiden Lösungen versuchen, Benchmarking sie mit microtime , auf der PHP-Seite, zum Beispiel ; -)

Andere Tipps

Für eine schnellere Zeit Sie alle Einsätze in einem Schuss tun können, oder Gruppe sie zusammen, vielleicht 5 oder 10 zu einem Zeitpunkt, als ob ein Einsatz nicht die gesamte Charge wird.

http://www.desilva.biz/mysql/insert.html

Eine Transaktion wird Sie verlangsamen, so dass, wenn Sie es nicht brauchen dann nicht verwenden.

Eine vorbereitete Erklärung wäre eine gute Wahl sein, obwohl auch wenn Sie Batch-Einsätze haben, wie Sie auf die Abfrage jedes Mal den Aufbau nicht zu halten.

ich die gleiche Frage konfrontiert, wenn ich hatte eine CSV-Datei (möglicherweise ziemlich lang) Datenimport zu implementieren (Ich weiß, dass Sie die LOAD DATA INFILE Syntax, aber ich hatte einige Verarbeitung auf meinen Feldern vor dem Einsetzen).

anzuwenden

Also habe ich ein Experiment mit Transaktionen und eine Datei mit über 15k Zeilen. Das Ergebnis ist, dass, wenn ich alle Datensätze innerhalb einer einzigartigen Transaktion einfügen, es dauert nur ein paar Sekunden, und es ist die CPU gebunden. Wenn ich eine Transaktion überhaupt nicht verwenden, dauert es einige Minuten, und es ist IO begrenzt. alle N Reihen durch Begehen, ich habe Zwischenergebnisse.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top