Ist es in MySQL schneller möglich, vorhandene Zeilen zu löschen und dann einzufügen, oder ist es schneller, vorhandene Zeilen zu aktualisieren?

9

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:

  • Führen Sie eine Massenlöschung aller Zeilen durch, in denen user_id mit
  • übereinstimmt
  • Dann mache eine Masseneinfügung aller neuen Zeilen

Option 2:

  • Gehen Sie jede aktuelle Zeile durch, um zu sehen, was geändert wurde, und aktualisieren Sie sie entsprechend
  • Wenn mehr Zeilen eingefügt werden müssen, machen Sie das.
  • Wenn Zeilen gelöscht werden müssen, tun Sie das.

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?

    
Philip Walton 26.10.2010, 02:25
quelle

2 Antworten

9

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

    
Srikar Appalaraju 26.10.2010, 02:37
quelle
1

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.

    
Amir Raminfar 26.10.2010 14:45
quelle

Tags und Links