Ein Teil des Systems, an dem ich gerade arbeite, ist ein mysql-Protokoll, bei dem die Anzahl häufig aktualisiert wird.
Die einzufügenden Daten haben das folgende Format:
%Vor% Diese Daten werden regelmäßig aus einer Flat-Datei analysiert, die wie oben in Vorbereitung auf eine DB-Einfügung / Aktualisierung zusammengefasst wird - der eindeutige Schlüssel in der Datenbank ist das (date, name)
-Paar.
Früher hat dieses System die vorhandene Tabelle auf Datensätze für ein bestimmtes Paar date
und name
geprüft, bevor es sich für ein Update oder eine Einfügung entschieden hat.
Das Problem, das wir haben, ist, dass mit dieser Tabelle die Reaktionszeit nicht besser wird und wir die Anzahl der Abfragen so weit wie möglich reduzieren wollen.
Das System wurde kürzlich aktualisiert, um eine INSERT ... ON DUPLICATE KEY UPDATE
zu verwenden Abfrage, die die Anzahl von select
s marginal reduziert hat, aber unser häufiger Fall ist die update
.
Ich frage mich, ob jemand eine Mysql-Funktion kennt, die im Wesentlichen INSERT ... ON DUPLICATE KEY UPDATE
in umgekehrter Richtung ist, d. h. wird versuchen, eine Zeile zu aktualisieren, wenn keine Übereinstimmung dann die Einfügung durchführen?
Bearbeiten
Ich habe es oben nicht zu deutlich gemacht, was ich tun möchte, wenn ich zum Beispiel den Datensatz ('2009-01-12','alan','5')
habe:
und wenn das obige fehlschlägt, fügen Sie die obigen Daten ein. Die Notwendigkeit, einen Zähler zu erhöhen, ist der Grund, warum REPLACE
nicht funktioniert. Ersetzen führt eine Löschung durch & amp; einfügen, und Sie können nicht auf die Zeile verweisen, die gelöscht wird, so count = count + 5
würde den vorherigen count
-Wert für um 5 nicht erhöhen.
@jasoncohen - the INSERT ... ON DUPLICATE KEY UPDATE
macht den Job, aber ich frage, ob es einen optimalen Weg gibt, dies zu tun.
Entschuldigen Sie die Verwirrung, die sich aus der schlechten Originalphrasierung ergibt!
Es ist genauso. Mit "UPDATE ... ON KEY KEY INSERT" muss die Datenbank-Engine erst noch prüfen, ob etwas zu aktualisieren ist. Daher ist kein separates Konstrukt erforderlich, selbst wenn das Update am häufigsten ist
Ich habe versucht herauszufinden, was genau Sie wollen, und wie ich es sehe, wollen Sie nichts tun, wenn die Daten übereinstimmen? Ich sehe keine Lösung für diese, wenn die "Anzahl" irgendwie ändern und aktualisieren müssen, stecken Sie fest mit der INSERT INO DUPLICATE KEY UPDATE (mit dem ich nicht wirklich das Problem sehe).
Wenn die Anzahl jedoch nie aktualisiert wird, sollten Sie INSERT IGNORE INTO (INSERT IGNORE INTO) betrachten, das die Einfügung ignoriert, wenn der eindeutige Schlüssel (Datum + Name) bereits existiert.
Sie haben es nicht in Betracht gezogen, Ihre Flat-Datei zu "spülen / rotieren" und nur nach hinzugefügtem Material zu suchen? Oder ist das nicht möglich?
Bearbeiten:
Das INSERT wird sofort aufgrund der doppelten Schlüsselverletzung fehlschlagen und das UPDATE in diesem Fall auslösen. Sollte überhaupt keine Leistungsbeeinträchtigung sein. Ich mache dies die ganze Zeit auf einer ziemlich großen Datenbank, und ich habe keinen großen Leistungsunterschied bemerkt, wenn ich von einer leeren Datenbank im Gegensatz zu einer bereits gefüllten Datenbank anfange.
Es ist jedoch wahrscheinlich eine gute Sache, ANALYZE TABLE / OPTIMIZE TABLE von Zeit zu Zeit auszuführen, um den Index in gutem Zustand zu halten.
Warum ist die INSERT
nicht ausreichend? Auch wenn es sich meistens um einen Zweitschlüssel und somit um ein Update handelt (statt umgekehrt), ist es immer noch die richtige Operation, oder?
Fragen Sie nur nach Performance-Bedenken?
Tags und Links optimization mysql