Laravel - SQL Datensätze löschen?
Hallo, ich möchte gerne wissen, was die beste Lösung ist um einen Datensatz in Laravel zu löschen:
1) Den Datensatz ganz löschen, sodass nichts mehr in der Datenbank davon existiert, sprich ich habe auch kein Backup
2) Den Datensatz in eine zzz_... Tabelle verschieben, sodass ich einen Backup habe und das Abspeichern der Performance dieser Tabelle zu gute kommt.
3) Ein Flag deleted setzen und einen Backup haben.
Möchte dabei vor allem auf die Performance achten. Gibt es noch weiter Möglichkeiten?
1 Antwort
Eine Kombination aus 3) und 2) würde ich noch in Betracht ziehen: Im laufenden Betrieb das Flag deleted setzen (wobei ich da einen Timestamp (NULL=nicht gelöscht) nehmen würde, weil dann kann ich Datensätze, die vor mehr als X Tagen gelöscht wurden, ggfs. archivieren oder endgültig löschen). Dann in einem Cronjob irgendwann in der Nacht einmal täglich oder wie immer du willst die gelöschten Daten gesammelt umkopieren und aus der aktiven DB löschen. Je nach Datenbank dann ggfs. noch ein "optimize table" o.Ä. hinterherschicken.
Selbst der Fall 1) kann sinnvoll sein, z.B., wenn eh jede Nacht die gesamte DB noch einmal extern gesichert wird. Kommt halt auch darauf an, wie oft du damit rechnest, das versehentlich gelöscht wurde oder ob du aus anderen Gründen die Daten archivieren musst...
Es ist halt die Frage, wieviele Datensätze du da erwartest. Wenn die Indexe passen, merkst du bei einer halben Million DS in einer Tabelle noch nicht wirklich eine Performanceeinbuße. Selbst mein Backup-Katalog mit >20Mio Datensätzen ist bedienbar, allerdings merkt man da Verzögerungen.
Naja, das es für die Felder, die in WHERE Bedingungen bei den Abfragen oft vorkommen, passende, ggfs. auch zusammengesetze Indexe (CREATE INDEX) gibt. Bei mysql/mariadb kann man mit EXPLAIN SELECT ... nachschauen, wie der eine Abfrage ausführt und da ggfs. optimieren. Wenn da irgendwas mit ALL oder FULL TABLESCAN rauskommt, ists halt langsam. Bei JOINs kann manchmal auch die Umstellung der Reihenfolge eine Abfrage beschleunigen. Da zusätzliche Indexe zwar Abfragen beschleunigen, aber Updates/Inserts langsamer machen, macht es aber keinen Sinn, für Alles einen Index zu erzeugen.
Das mit dem deleted timestamp ist nicht einmal eine schlechte Idee. Somit kann ich mit dem Crawler alle 2 Wochen drübergehen und die Daten endgültig löschen. Bis dahin sollte jeder die Möglichkeit haben den Fehler rückgängig zu machen. Der Grund wieso ich die gelöschten Datensätze in eine eigene Tabelle verschieben wollte, lag darin, dass dann die Performance besser wäre, wenn es wirklich viele Datensätze in der Tabelle geben würde und diese gelöschten Einträge nicht mehr berücksichtigt werden müssten.