In MySQL ist es schneller einfügen zu löschen und dann oder ist es schneller vorhandene Zeilen zu aktualisieren?

StackOverflow https://stackoverflow.com/questions/4020240

  •  26-09-2019
  •  | 
  •  

Frage

Zunächst einmal möchte ich nur sagen, dass ich das PHP-Framework Yii bin mit, so Ich mag würde innerhalb seiner definierten Satz von SQL-Anweisung bleiben, wenn möglich. Ich weiß, ich könnte wahrscheinlich eine riesige langen SQL-Anweisung erstellen, die alles tun würden, aber ich würde lieber nicht dorthin gehen.

OK, stelle ich mir eine Tabelle Benutzer haben und einen Tisch FavColors. Dann habe ich eine Form, wo Nutzer ihre Farbeinstellungen indem Sie ein oder mehrere Kontrollkästchen aus einer großen Liste der möglichen Farben auswählen können.

Diese Ergebnisse werden gespeichert, wie mehrere Zeilen in der FavColors Tabelle wie folgt (id, user_id, color_id).

Stellen Sie sich nun der Benutzer geht in und ändert ihre Farbe bevorzugt. In diesem Szenario, was der effizienteste Weg sein würde, die neuen Farbeinstellungen in die Datenbank zu bekommen?

Option 1:

  • Sie eine Masse löscht alle Zeilen, in denen User_id Streichhölzer
  • Dann machen Sie einen Masseneinsatz aller neuen Reihen

Option 2:

  • Gehen Sie durch jede aktuelle Zeile zu sehen, was sich verändert hat, und entsprechend aktualisiert
  • Wenn mehrere Zeilen eingefügt werden müssen, tun.
  • Wenn Zeilen gelöscht werden müssen, tun.

ich wie eine Option, weil es erfordert nur zwei Aussagen, sondern etwas fühlt sich einfach falsch über eine Reihe einfach zu löschen, um potenziell fast exakt in denselben Daten zurückstellen. Es gibt auch die Frage der Herstellung die ids Autoinkrement auf höhere Werten mehr schnell, und ich weiß nicht, ob das, wann immer möglich, vermieden werden sollte.

Option 2 wird viel mehr Programmieraufwand erfordern, würde aber Situationen verhindern, in denen ich nur eine Zeile löschen würde es wieder zu erstellen. Allerdings lohnt sich für MySQL die Abnahme der Last kann nicht mehr Last in PHP hinzufügen.

Alle Gedanken? Was würden Sie alles tun?

War es hilfreich?

Lösung

UPDATE ist von schneller weit viel. Wenn Sie UPDATE werden die Datensätze der Tabelle nur mit neuen Daten überschrieben werden. Und das alles muss wieder auf INSERT erfolgen.

Wenn Sie DELETE sollten die Indizes aktualisiert werden (denken Sie daran, Sie die ganze Zeile löschen, nicht nur die Spalten, die Sie ändern müssen) und Datenblöcke bewegt werden (wenn Sie die PCTFREE Grenze erreicht). Auch das Löschen und neue Änderungen Datensätze IDs auf auto_increment hinzufügen, so dass, wenn die Datensätze haben Beziehungen, die gebrochen werden würde, oder würde Updates müssen. Ich würde für UPDATE gehen.

Deshalb sollten Sie INSERT ... ON DUPLICATE KEY UPDATE statt REPLACE vorziehen sollte.

Die erstere ist ein UPDATE Betrieb im Fall einer Schlüsselverletzung, während die letztere 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;

Für weitere Details lesen Update Dokumentation

Andere Tipps

Philip, Haben Sie versucht, vorbereitete Anweisungen zu tun? Mit vorbereiteten Anweisungen können Sie Batch eine Abfrage mit unterschiedlichen Parametern und es mehrmals aufrufen. Am Ende der Schleife, können Sie alle mit minimaler Menge von Netzwerk-Latenz auszuführen. Ich habe vorbereitete Anweisungen mit PHP verwendet und es funktioniert super. Wenig mehr verwirrend als Java vorbereitete Anweisungen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top