2009-01-21 6 views
8

Ein Teil des Systems, an dem ich gerade arbeite, ist ein mysql-Protokoll, bei dem die Anzahl häufig aktualisiert wird.MySQL-Funktion zum Einfügen von Datensatz, wenn das Update fehlschlägt?

Die Daten eingefügt werden, ist das Format:

date | name | count | 
-----------+------+-------+ 
2009-01-12 | alan | 5 | 
2009-01-12 | dave | 2 | 
2009-01-12 | mary | 1 | 

Diese Daten regelmäßig aus einer flachen Datei analysiert wird, wie oben in der Vorbereitung für einen db insert/update zusammengefasst - der eindeutige Schlüssel für die Datenbank ist die (date, name) Paar.

Zuvor wurde dieses System die vorhandene Tabelle auf Datensätze für ein bestimmtes date und name Paar prüfen, bevor eine Aktualisierung oder ein Einfügen entschieden wurde.

Das Problem, das wir haben, ist, wie diese Tabelle wächst, die Antwortzeit wird nicht besser, und wir wollen die Anzahl der Abfragen so weit wie möglich reduzieren.

Das System wurde vor kurzem eine INSERT ... ON DUPLICATE KEY UPDATE Abfrage auszuführen aktualisiert, die die Anzahl der select s mit deutlichem Abstand geringfügig, aber unsere gemeinsamen Fall ist die update reduziert hat.

Ich frage mich, ob jemand weiß eine mysql-Funktion, die im Wesentlichen INSERT ... ON DUPLICATE KEY UPDATE in umgekehrter Reihenfolge, d. H. Wird versuchen, eine Zeile zu aktualisieren, wenn keine übereinstimmen, dann führen Sie die Einfügung?


bearbeiten

ich nicht machen war es klar, über das, was ich tun möchte, wenn ich den Rekord ('2009-01-12','alan','5') zum Beispiel haben, ist:

UPDATE table SET count = count+5 WHERE date = '2009-01-12' and name = 'alan'; 

und wenn die oben schlägt fehl, fügen Sie die obigen Daten ein. Die Notwendigkeit, einen Zähler zu erhöhen, ist der Grund, warum REPLACE nicht funktioniert. Ersetzen Sie führt einen Lösch & Einsatz und lässt Sie nicht auf die Zeile verweisen gelöscht werden, so würde count = count + 5 nicht den vorherigen count Wert erhöhen für von 5.

@jasoncohen - die INSERT ... ON DUPLICATE KEY UPDATE die Arbeit tut, aber ich Ich frage, ob es einen optimaleren Weg gibt, dies zu tun.

Entschuldigung für jegliche Verwirrung aufgrund der schlechten Originalphrasierung!

Antwort

3

Es ist genau das gleiche. Mit "UPDATE ... ON KEY KEY INSERT" muss die Datenbank-Engine erst noch prüfen, ob etwas zu aktualisieren ist. Daher keine Notwendigkeit für ein separates Konstrukt, auch wenn das Update am häufigsten ist

+0

Macht Sinn, fragte mehr in der Hoffnung als Erwartung, dass es eine magische, super-performende MySQL-Abfrage dafür gibt! – ConroyP

+0

Ein Anwendungsbeispiel wäre nett. –

+0

@HelgaIliashenko bitten, zuerst nach einem Verwendungsbeispiel zu fragen, bevor das Downvoting wäre nett –

0

Warum ist die INSERT nicht ausreichend? Auch wenn es sich meistens um einen Zweitschlüssel handelt und somit ein Update (statt umgekehrt), ist es immer noch die richtige Operation, oder?

Fragen Sie nur nach Leistungsproblemen?

1

Ich habe versucht herauszufinden, was exatcly ist, dass Sie wollen, und wie ich es sehe, wollen Sie nichts tun, wenn die Daten übereinstimmen ?Ich sehe keine Lösung dafür, wenn die "Anzahl" sich irgendwie ändert und aktualisiert werden muss, stecken Sie fest mit dem INSERT INTO DUPLICATE KEY UPDATE (mit dem ich das Problem nicht wirklich sehe).

Wenn jedoch die Anzahl nie aktualisiert wird, möchten Sie möglicherweise in INSERT IGNORE INTO suchen, die die Einfügung ignoriert, wenn der eindeutige Schlüssel (Datum + Name) bereits existiert.

Sie haben es nicht in Betracht gezogen, Ihre Flatfile zu "spülen/rotieren" und nur nach hinzugefügtem Material zu suchen? Oder ist das nicht möglich?

Edit:

Die INSERT wird wegen der doppelten Schlüssel Verletzung nicht sofort, und löst das Update in diesem Fall. Sollte überhaupt keine Leistungsbeeinträchtigung sein. Ich mache dies die ganze Zeit über ziemlich große Datenbanken, und ich habe keinen großen Leistungsunterschied bemerkt, wenn ich von einer leeren Datenbank im Gegensatz zu einer bereits gefüllten Datenbank ausginge.

Es ist jedoch wahrscheinlich eine gute Sache, ANALYZE TABLE/OPTIMIZE TABLE von Zeit zu Zeit auszuführen, um den Index in guter Form zu halten.

Verwandte Themen