trigger - mysql update replace
Was sind die praktischen Unterschiede zwischen "REPLACE" und "INSERT... ON DUPLICATE KEY UPDATE" in MySQL? (5)
In welchen Fällen kann REPLACE gegenüber INSERT ... ON DUPLICATE KEY UPDATE bevorzugt werden und umgekehrt?
Ich habe gerade den harten Weg herausgefunden, dass im Fall von Tabellen mit einer FEDERATED-Speicher-Engine INSERT...ON DUPLICATE KEY UPDATE
Anweisungen akzeptiert werden, aber fehlschlagen (mit einem Fehler 1022: Kann nicht schreiben; Schlüssel in Tabelle duplizieren. ..) wenn eine doppelte Schlüsselverletzung auftritt - siehe entsprechenden Aufzählungspunkt auf dieser Seite des MySQL Referenzhandbuchs.
Glücklicherweise konnte ich REPLACE
anstelle von INSERT...ON DUPLICATE KEY UPDATE
innerhalb meines After-Insert-Triggers verwenden, um das gewünschte Ergebnis der Replikation von Änderungen an einer FEDERATED-Tabelle zu erzielen.
Was ich brauche, ist, die Werte aller Felder eines Datensatzes mit einem bestimmten Schlüssel (der Schlüssel ist eigentlich zusammengesetzt) zu setzen und den Datensatz einzufügen, wenn noch kein Datensatz mit einem solchen Schlüssel vorhanden ist.
REPLACE
scheint die Aufgabe zu erledigen, aber gleichzeitig schlägt die Manual Page INSERT ... ON DUPLICATE KEY UPDATE
.
Was sollte ich besser wählen und warum?
Der einzige "Nebeneffekt" von REPLACE
, der mir in den Sinn kommt, ist, dass Autoincrement-Werte erhöht würden (zum Glück nutze ich keine), während INSERT ... ON DUPLICATE KEY UPDATE
wahrscheinlich nicht INSERT ... ON DUPLICATE KEY UPDATE
würde. Welche weiteren praktischen Unterschiede sind zu beachten? In welchen Fällen kann REPLACE
gegenüber INSERT ... ON DUPLICATE KEY UPDATE
bevorzugt werden und umgekehrt?
"Es ist möglich, dass im Falle eines Doppelschlüsselfehlers eine Speicher-Engine den REPLACE als Update statt als Delete plus Insert ausführt, aber die Semantik ist dieselbe."
Um die Frage in Bezug auf die Leistung zu beantworten, habe ich einen Test mit beiden Methoden durchgeführt
Replace Into beinhaltet:
1.Schieben Sie auf den Tisch
2. Wenn 1 fehlschlägt, Zeile löschen und neue Zeile einfügen
Bei Duplicate Key Update einfügen beinhaltet:
1.Trie einfügen auf den Tisch
2. Wenn 1 fehlschlägt, aktualisieren Sie die Zeile
Wenn alle beteiligten Schritte Einfügungen sind, sollte es keinen Unterschied in der Leistung geben. Die Geschwindigkeit hängt von der Anzahl der Updates ab. Worst Case ist, wenn alle Anweisungen Updates sind
Ich habe versucht sowohl die Aussagen in meiner InnoDB-Tabelle 62.510 Einträge (nur Updates). Auf Campinggeschwindigkeiten:
Ersetzen in: 77.411 Sekunden
Bei Duplicate Key Update einfügen: 2,446 Sekunden
Insert on Duplicate Key update is almost 32 times faster.
Tabellengröße: 1.249.250 Zeilen mit 12 Spalten auf einem Amazon m3.medium
Wenn REPLACE
anstelle von INSERT ... ON DUPLICATE KEY UPDATE
, beobachte ich manchmal Schlüsselsperr- oder Deadlock-Probleme, wenn mehrere Abfragen schnell nach einem bestimmten Schlüssel ankommen. Die Atomizität der letzteren (zusätzlich dazu, keine Kaskadenlöschungen zu verursachen) ist ein Grund mehr, sie zu verwenden.
REPLACE
führt intern eine Löschung und dann eine Einfügung durch. Dies kann zu Problemen führen, wenn eine Fremdschlüsseleinschränkung auf diese Zeile zeigt. In diesem REPLACE
könnte die REPLACE
fehlschlagen oder sogar noch schlimmer: Wenn Ihr Fremdschlüssel auf "Kaskadenlöschung" eingestellt ist, REPLACE
, dass Zeilen aus anderen Tabellen gelöscht werden. Dies kann passieren, obwohl die Bedingung sowohl vor als auch nach der REPLACE
Operation REPLACE
.
Die Verwendung von INSERT ... ON DUPLICATE KEY UPDATE
vermeidet dieses Problem und wird daher bevorzugt.