[PHP/MySQL] mysql_affected_rows() oder ON DUPLICATE KEY UPDATE

27o8

abgemeldet
2 Mai 2006
9.028
933
Moin,
ein bekannter und ich haben letztens diskutiert was wohl besser ist und ich wollte mal eure Meinung hören!

Er sagt das hier wäre besser:
PHP:
mysql_query ('UPDATE table SET punkte = punkte + '.$buchungssumme.' WHERE uid = '.$fuer);
        if (mysql_affected_rows () == 0) mysql_query ('INSERT INTO tabelle (uid,punkte) VALUES ('.$fuer.', '.$buchungssumme.')');
Ich meine das hier wäre besser:
PHP:
mysql_query('INSERT INTO table (uid,punkte) VALUES ('.$fuer.','.$buchungssumme.') 
       ON DUPLICATE KEY UPDATE punkte=punkte+'.$buchungssumme.'');
Primary Key auf uid ^^

Was sagt eure Erfahrung? Welches davon ist besser im Sinne von:
- Performance
- Serverlast

Gruß
Gremlin
 
Das eine geht von PHP an den Mysql-server, und das andere legt diesen Weg mehrmals zurück - also ist das erstere wohl deutlich schneller ;)

edit: also das zweite Beispiel ist schneller, das "erstere" war auf meinen Satzbau bezogen ;)
 
Zuletzt bearbeitet:
Das eine geht von PHP an den Mysql-server, und das andere legt diesen Weg mehrmals zurück - also ist das erstere wohl deutlich schneller ;)

neija so kannst du das nicht sagen :p
Beim ersten haben wir im Extremfall 2 Querys und zudem noch die Möglichkeit einer Race-Condition, dass sich 2 Prozesse überschneiden und eventuell beide zu dem Insert kommen.

Beim 2. haben wir einen Insert-Befehl der sich direkt in einen Update-Befehl umwandelt sofern es den Key schon gibt, dementsprechend muss nur ein Query geparsed und optimiert werden, wie genau der MySQL dies nun genau behandelt ist mir nicht bewusst, aber ich denke mal genau wie bei einem Update Befehl wird bei einem Insert erstmal gegugt ob es solch einen Eintrag schon gibt (wegen Unique-Id) und falls dieser da ist wird upgedated, ansonsten eben geinsertet, also deutlich schneller, das Konstrukt gibt es ja nicht zum Spaß an der Freude, sondern es wurde sich was dabei gedacht

Edit: Race Conditions in Fall 1 hatte ich schon, also keineswegs sehr unrealistisch ;)

Edit2: Performance = Serverlast :!: