Zuerst möchte ich sagen, dass ich das PHP-Framework Yii verwende, also möchte ich, wenn möglich, innerhalb der definierten SQL-Anweisung bleiben. Ich weiß, dass ich wahrscheinlich eine riesige SQL-Anweisung erstellen könnte, die alles tun würde, aber ich würde lieber nicht dorthin gehen.
OK, stellen Sie sich vor, ich habe eine Tabelle Benutzer und eine Tabelle FavColors. Dann habe ich ein Formular, wo Benutzer ihre Farbeinstellungen auswählen können, indem sie ein oder mehrere Kontrollkästchen aus einer großen Liste möglicher Farben auswählen.
Diese Ergebnisse werden als mehrere Zeilen in der FavColors-Tabelle gespeichert (id, user_id, color_id).
Stellen Sie sich nun vor, der Benutzer geht hinein und ändert seine Farbeinstellungen. Was wäre in diesem Fall die effizienteste Methode, um die neuen Farbeinstellungen in die Datenbank zu übernehmen?
Option 1:
Option 2:
Ich mag Option eins, weil es nur zwei Anweisungen benötigt, aber etwas fühlt sich einfach falsch an beim Löschen einer Zeile, nur um fast genau die gleichen Daten wieder einzufügen. Es gibt auch das Problem, die IDs automatisch auf höhere Werte zu erhöhen schnell, und ich weiß nicht, ob das möglichst vermieden werden sollte.
Option 2 erfordert viel mehr Programmierarbeit, würde aber Situationen verhindern, in denen ich eine Zeile löschen würde, nur um sie erneut zu erstellen. Das Hinzufügen von mehr Last in PHP ist jedoch möglicherweise nicht die Verringerung der Last für MySQL wert.
Irgendwelche Gedanken? Was würden Sie alle tun?
UPDATE
ist bei weitem viel schneller. Wenn Sie UPDATE
eingeben, werden die Tabellensätze nur mit neuen Daten überschrieben. Und das alles muss wieder in INSERT
gemacht werden.
Wenn Sie DELETE
, sollten die Indizes aktualisiert werden (denken Sie daran, Sie löschen die ganze Zeile, nicht nur die Spalten, die Sie ändern müssen) und Datenblöcke können verschoben werden (wenn Sie PCTFREE
limit treffen). Durch das Löschen und Hinzufügen neuer Änderungen werden IDs in auto_increment aufgezeichnet, wenn diese Datensätze also Beziehungen aufweisen, die unterbrochen werden oder auch Aktualisierungen benötigen. Ich würde für UPDATE
gehen.
Deshalb sollten Sie INSERT ... ON DUPLICATE KEY UPDATE
anstelle von REPLACE
bevorzugen.
Der vorherige ist eine Operation UPDATE
im Falle einer Schlüsselverletzung, während der letzte ist DELETE / INSERT
UPDATE: Hier ist ein Beispiel INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
Weitere Informationen finden Sie in der Dokumentation
Philipp, Hast du versucht, vorbereitete Aussagen zu machen? Mit vorbereiteten Anweisungen können Sie eine Abfrage mit verschiedenen Parametern chargen und mehrfach aufrufen. Am Ende Ihrer Schleife können Sie alle mit minimaler Netzwerklatenz ausführen. Ich habe vorbereitete Aussagen mit PHP verwendet und es funktioniert super. Etwas verwirrender als Java vorbereitete Aussagen.
Tags und Links php mysql performance yii