[MySQL] Frage zu "UPDATE"

Gollum

Loswetten.de
ID: 96060
L
20 April 2006
2.327
188
Hi,

ich möchte performance-technisch ein Skript verbessern, nun habe ich folgende Frage:

bisher:
UPDATE tabelle SET zeit = time() WHERE id=1 LIMIT 1

jez müsste die zeit allerdings eigentlich z.b. nur alle 5 minuten aktualisiert werden:

UPDATE tabelle SET zeit = time() WHERE id=1 AND zeit<(time()-300) LIMIT 1

Würde dies etwas bringen um die Datenbank zu entlasten?

Vielen Dank schonmal,

Gruß Gollum
 
Würde dies etwas bringen um die Datenbank zu entlasten?

Das dürfte kaum was bringen, denn die Abfrage wird ja trotzdem noch an die DB geschickt. Außerdem muss eine zusätzliche Bedingung geprüft werden beim Update.

Du musst deine Applikation außen rum so aufbauen, dass diese Abfrage z.B. durch einen Cronjob alle 5 Minuten ausgeführt wird. Das dürfte weitaus effizienter sein, als ein Conditional Update...

Greetz

paddya
 
Zuletzt bearbeitet:
Doch, das sollte durchaus etwas bringen.

Es stimmt zwar, dass eine Abfrage mehr zu evaluieren ist, aber andererseits, wenn dadurch kein Update gemacht wird, dann muss kein Log-Satz geschrieben werden, das Locking wird verringert...

ausserdem solltest Du bereits am Returncode sehen, ob ein Update durchgeführt wurde oder nicht.

Ich selbst würde definitiv diese zusätzliche Abfrage mit einbauen
 
Ich würde einen Cronjob anlegen (zur Not eben cronjob.de), falls die Abfrage wirklich alle 5 Minuten ausgeführt werden muss.
 
Ich selbst würde definitiv diese zusätzliche Abfrage mit einbauen
ich auch.

Es stimmt zwar, dass eine Abfrage mehr zu evaluieren ist, aber andererseits, wenn dadurch kein Update gemacht wird, dann muss kein Log-Satz geschrieben werden, das Locking wird verringert...
je nach Implementation des Lockings, so zB bei MyIsam könnte es möglich sein, den globalen Lock auf die Tabelle zu vermeiden, wenn die Engine merkt, dass sie in echt nichts updaten muss.
Da ich nicht in den Source gesehen habe, kann ich aber nicht sagen, ob es diesen wirklich vermeidet.
 
@ice-breaker:
Dein Einwand ist grundsätzlich berechtigt.

Der Update lautet allerdings :

Code:
UPDATE tabelle SET zeit = [COLOR="Red"]time() [/COLOR]WHERE id=1 LIMIT 1

ich gehe also davon aus, dass sich der Zeileninhalt tatsächlich jedesmal ändert.

Wenn allerdings alter Wert = neuer Wert ist, dann hängt es tatsächlich von der Engine ab, ob ein Update durchgeführt wird.
Ich erinnere mich daran, dass DB2 for z/OS Version 7 so einen Update erlaubt hat, obwohl die Tabelle im "Read-Only" Status war, während Version 8 den gleichen Update abgewiesen hat.
 
Da musst du bestialisch aufpassen. Dein erstes statement updatet ein statement (LIMIT 1) egal welcher wert in zeit steht. Das zweite updatet eine andere row. Rein performancetechnisch is die zweite anfrage teurer (wegen der WHERE condition) angenommen die LIMITs sind nicht einfach nur so da.
 
ich gehe davon aus, dass ID der Primärschlüssel der Tabelle ist und es darum geht, ob die Zeile immer geändert werden soll oder ggf. nicht.
 
Hi,

danke für eure Antworten.

ID ist der Primärschlüssel der Tabelle.

Ich habe es nun eingebaut, ansonsten darf hier gerne weiterdiskutiert werden.