Hallo, Gast! (Registrieren)

Letzte Ankündigung: MyBB 1.8.38 veröffentlicht (30.04.24)


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste
19k Posts eines Users löschen - Abschätzbar wie lange es dauert?
#11
Mit solchen Aussagen zum Thema Performance wäre ich sehr vorsichtig, GreenDragon.
Im Prinzip kommt es ausschließlich auf die Formulierung der Datenbankabfrage an wie schnell selbige abgearbeitet wird (Datenbankgröße ist zweitrangig). Wenn du Daten aus der Datenbank löscht, wird lediglich der entsprechende Speicher freigegeben. Es wird jedoch nicht jeder Eintrag bitweise mit nullen überschrieben. (Es erfolgt kein 'sicheres' löschen)

Wenn du z.B. ein DELETE FROM 'users' WHERE id > 10 ausführen würdest bei einer user-db mit mehr als 10.000 Einträgen, würde die Datenbank nur müde lächeln und binnen Sekunden, wenn nicht schneller den query ausführen.
Hast du allerdings komplexere Formulierungen, Joins und Abhängigkeiten (Fremdschlüsselprüfung) in einem Query, sieht die Sache schon ganz anders aus.
Analog: Ein Drop Table / Truncate Table geht auch schneller, als wenn du ein DELETE -Statement schreibst, in welchem du jede einzelne ID eines Datensatzes angibst, der zu löschen ist.

Da du von 10 Seiten sprachst, nehme ich an, dass du das löschen über PHPMyAdmin erledigt hast? Dort würde nämlich, wenn du die jeweiligen Datensätze über die Übersicht markierst im Endeffekt auch ein DELETE-Statement mit WHERE ID = <Datensatz_ID> ausgeführt werden, was bei 200 IDs auch entsprechend langsam ist.

Um es mal etwas konkreter zu zeigen, einmal ein Beispiel. Nehmen wir einmal deine 200-Einträge einer Tabelle, die meinetwegen 5000 Einträge hat.

Dabei wäre
Code:
DELETE FROM <tabelle> WHERE id = 1 OR id = 2 OR id = 3 OR id = 4 OR .....

deutlich langsamer als
Code:
DELETE FROM <tabelle> WHERE id >= 1 AND id <= 200


@UnkreativerUser:
Wie StefanT schon anmerkte gibt es eine Funktion im ACP für deine Problemstellung. Diese würe im Endeffekt nach der zweiten von mir beschriebenen Methode arbeiten. Schematisch etwa folgendermaßen:

Code:
DELETE FROM posts WHERE user_id = <id>

Das ist entsprechend auch um ein vielfaches performanter, als alles über die Moderations-Optionen zu löschen.

MfG
Raphael
#12
Erst mal Danke für die interessante Info, denn mit SQL habe ich nur minimale Grundkenntnisse. Wink

Raphael schrieb:Da du von 10 Seiten sprachst, nehme ich an, dass du das löschen über PHPMyAdmin erledigt hast? Dort würde nämlich, wenn du die jeweiligen Datensätze über die Übersicht markierst im Endeffekt auch ein DELETE-Statement mit WHERE ID = <Datensatz_ID> ausgeführt werden, was bei 200 IDs auch entsprechend langsam ist.

Das Löschen wurde ganz normal in der Listenansicht im Forum durchgeführt. Ich hatte dann alle Beiträge manuell angehakt und anschliessend dann gelöscht. Anfangs, wo das Forum ca. 10-20.000 Einträge hatte, hat das zwar auch ein wenig gedauert, aber es waren trotzdem nur wenige Sekunden bis der Vorgang abgeschlossen war. Mit jedem Monat wurden die Aktionen immer langsamer und letztendlich als eine 6-stellige Beitragsanzahl vorhanden war, dauerte es um ein vielfaches länger. Deswegen mein Rückschluss, dass mit steigender Datenbankgrösse die Aktion länger dauert, da vermutlich viel mehr SQL-Zeilen durchsucht werden müssen.

Das selbe habe ich dann bei einem Bekannten, wo ich als Admin aushelfen sollte auch festgestellt. Auch bei Ihm war es in den ersten Wochen alles relativ fix, aber nach mehreren Monaten auch dort bei grossen Löschaktionen extrem langsam. Ich konnte das dann mal genauer nachvollziehen, als ich via Xampp dieses alte grosse Forum auch cleanen musste. Ich wollte 80% der gesamten Beiträge entfernen. ich selektierte in 200er-Schritten. Anfangs auch wieder unendliche Wartezeiten, und desto mehr die Database schrumpfte, desto schneller gingen die Löschvorgänge.

Ist das jetzt letztendlich normal oder unnormal? Big Grin Ich kann leider nur das wiedergeben was ich erlebt habe und ansonsten bin ich eher ein SQL-Noob.
#13
Naja in MyBB gibts z.B. so Code wie: (mal willkürlich aus der moderation.php rausgegriffen)

Code:
foreach($threadlist as $tid)
                {
                        $tid = intval($tid);
                        $moderation->delete_thread($tid);
                        $tlist[] = $tid;
                }

Da wird also jeder Thread einzeln gelöscht, jeweils mit eigenen Queries, statt alles zusammen auf einmal in einem Query. Das ist dann natürlich langsam, wenn man es in einem Maßstab von einigen tausend macht statt nur zwei oder drei.

Ab einer bestimmten Menge funktioniert das mit dem "anhaken" sowieso nicht mehr. Zumindest das Inline-Moderation-Zeugs wird in einem Cookie gespeichert und die haben nur begrenzt Platz. Auf so große Löschmengen ist das System dann eben einfach nicht ausgelegt. Im normalen Forenbetrieb kommt das ja eigentlich auch nicht vor.
#14
Bei der von frostschutz rausgefilterten Logik sieht man beim Löschen auch noch einen anderen Flaschenhals: Das PHP-Skript, bzw. der Interpreter. Grundsätzlich kann man davon ausgehen, dass PHP-Skripte langsamer abgearbeitet werden, als einfache(!) SQL-Statements.
Hier gebe es, meiner Meinung nach, Raum für Optimierung, z.B. die ausgewählten Themen/Beiträge als Array zu übergeben, und den Query entsprechend mittels prepared Statement in einer angepassten Version der Methode "delete_thread" (frostschutz Beispiel.) zu verarbeiten. Wohlmöglich macht man das in MyBB 2.0 besser Wink


@GreenDragon:
Nun, bevor ich an einer großen DB entsprechend viele Operationen mache, würde ich stehts zuvor ein "Optimize Table" ausführen. Damit kann man, proportional zur Größe der Datenbank und in Abhängigkeit deren Aufbaus für alle direkt folgende Querys u.U. einen Performanceschub von 1-50% erzielen. (Indezies werden neu sortiert, es wird hinter QUICK DELETE Anweisungen aufgeräumt, ....)
In besonders "schweren" Fällen kann der Geschwindigkeitsgewinn auch locker 90-95% betragen. Der Geschwindigkeitgewinn durch "optimize Table" ist allerdings immer stark abhängig von folgenden Faktoren:
1. Datenbankgröße (Je größer, desto mehr gibt es zu optimieren)
2. Vergangene Zeit zur letzten Optimierung (je länger, desto mehr Gewinn bringt eine Optimierung)
3. Datenbankschema (Je komplexer, desto mehr kann es bringen)
4. Jeweilige Tabellenart (MyISAM oder InnoDB; Grundsätzlich bringt es bei InnoDB meines Wissens nach mehr)

Natürlich ist es auch von der Auslastung des Datenbankserves abhängig. Wenn gerade auf einem Live-System aufgeräumt werden soll, und im Hintergrund gerade 200 User auf die Seite zugreifen, ist es verständlich, wenn dein eigener Query ggf. etwas langsamer abgearbeitet wird.

MfG
Raphael


Möglicherweise verwandte Themen…
Thema Verfasser Antworten Ansichten Letzter Beitrag
  Schnellantwort dauert 20 Sekunden forumfreund 9 2.705 10.12.2012, 14:31
Letzter Beitrag: forumfreund
  Themenzähler aktualisieren dauert ewig Paccy 4 1.998 31.07.2012, 08:32
Letzter Beitrag: Paccy
  Alle PN´s eines Users anzeigen lassen!? nobodyxxx 2 1.465 06.01.2011, 09:07
Letzter Beitrag: thebod