2016-06-03 2 views
0

Die Frage ist über SQL Legacy-Code für MySQL Datenbank.Leistung von VALUES (col_name) -Funktion in der UPDATE-Klausel

Es ist bekannt, dass, wenn INSERT ... ON DUPLICATE KEY UPDATE Anweisung VALUES(col_name) Funktion can be used tun aus dem INSERT -Teil auf Spaltenwerte beziehen sich stattdessen gibt genaue Werte übergeben:

INSERT INTO table (a,b,c) VALUES (1,2,3) 
    ON DUPLICATE KEY UPDATE b=VALUES(b), c=VALUES(c) 

viele große Einsätze in parametrisierte My Legacy-Code enthält Stil (sie in Batch-Einsätze verwendet werden):

INSERT INTO table (a,b,c, <...dozens of params...>) VALUES (?,?,?,<...dozens of values...>) 
    ON DUPLICATE KEY UPDATE b=?, c=?, <...dozens of params...> 

Die Frage ist: es wäre Leistung von Batch-Einsätze erhöhen, wenn ich all diese Abfragen ändernzu verwendenFunktion (in UPDATE Teil)?

Meine Abfragen werden von Java-Code mit jdbc Treiber ausgeführt. Also, was ich denke, ist, dass für lange Textwerte die Größe der Abfragen erheblich reduziert werden sollte. Was ist mit MySQL es selbst? Würde es mir im Allgemeinen eine höhere Geschwindigkeit geben?

+0

Ja für lange Werte können Sie einen marginalen Vorteil erhalten, aber diese Art von Aufwand ist es kaum wert, es sei denn, Sie eine Menge Datensätze pro Minute einfügen – e4c5

+0

Ich füge viele Datensätze in der Minute, in der Tat – Andremoniy

+0

würde es dann vermuten Sei es wert, da die Veränderung nicht zu viel Zeit in Anspruch nimmt. – e4c5

Antwort

-1

Stapel-Einsätze können 10-mal so schnell und eine Reihe hintereinander laufen. Der Grund dafür ist das gesamte Netzwerk usw. Overhead.

Eine andere Technik besteht darin, von einer einzelnen Batch-IODKU in zwei Anweisungen zu wechseln - eine zum Einfügen der neuen Zeilen, eine für die Aktualisierung. (Ich weiß nicht, ob das schneller geht.) Here ist eine Diskussion der beiden Schritte im Rahmen der "Normalisierung".

Eine andere Sache zu beachten: Wenn es eine AUTO_INCREMENT beteiligt (nicht als eine der Spalten erwähnt), dann IODKU "verbrennt" IDs für die Fälle, in denen es ein "Update". Das heißt, die IODKU (und INSERT IGNORE und ein paar andere) bekommen alle auto_incs, die es könnte benötigen, dann fährt fort, diejenigen zu verwenden, die es tut brauchen und verschwenden die anderen.

Sie kommen zu "abnehmenden Renditen", wenn Sie versuchen, mehr als ein paar hundert Zeilen in einen Stapel einzufügen. Und Sie betonen das Rollback-Protokoll.

+0

Sie haben die Frage nicht gelesen: ** Ich benutze bereits BATCH insertion **. Die Frage lautete, die Funktion 'VALUES' im Update-Teil zu verwenden. – Andremoniy

+0

Entschuldigung, ich habe es verpasst. (Sie haben die falsche Syntax.) –

+0

Wirklich? Warum ist es falsch? Ich benutze 'Spring'' JDBC' Stapeleinfügungen, also ist die Syntax in diesem Fall korrekt – Andremoniy