Performance in PDO / PHP / MySQL: Transaktion im Vergleich zu direkter Ausführung
-
06-07-2019 - |
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.
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).
anzuwendenAlso 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.