Rolf b: langsame MySQL Abfrage

Beitrag lesen

Gewinnst Du denn dadurch tatsächlich etwas?

In beiden Fällen muss die Auftrag- und Auftrag_Artikel Tabelle gelesen und die neue Summe berechnet werden. Darauf folgt dann ein Update. Nach Alt in jedem Fall, nach Neu nur bei Änderung.

Der Schreibvorgang sollte den kleinsten Teil des Aufwandes ausmachen.

Lasse einen EXPLAIN laufen und prüfe, ob Dir Indexe fehlen. Die Query sollte bei korrekter Indexierung nur dann langsam sein, wenn Du massenhaft Artikel am Auftrag hast.

Welche DB-Engine verwendest Du? MyISAM macht Table-Locks, keine Row-Locks, d.h. eine Anwendung, die viele User hat, die viele Updates machen, kann sich an den Sperren festfressen. DA kann deine Aufteilung sinnvoll sein. Trotzdem läufst Du dann Gefahr, inkonsistente Daten zu erhalten.

  1. Query (von Dir): neuen Gesamtpreis ermitteln
  2. Query (von anderem Benutzer): Rabatt ändern
  3. Query (von Dir): Gesamtpreis schreiben

Ein einzelner Update ist atomar, da kann die 2. Query sich nicht dazwischen schieben. Trennung in SELECT und UPDATE wird nur dann atomar behandelt, wenn Du eine Transaktion mit passendem Isolation Level verwendest. Dafür brauchst Du allerdings InnoDB, das wird von MyISAM nicht unterstützt.

Rolf