Welchen Zweck hat die „Cart“ Tabelle in Shopware, sind hier nur die verschiedenen Warenkörbe zwischengespeichert? Die Tabelle ist bei uns ziemlich voll und zieht die Performance des Servers sehr stark runter.
Gibt es einen Grund das diese nicht vom System bereinigt wird oder können wir diese einfach leeren?
Ja, das sind die Warenkörbe. Shopware löscht diese selbst nach 120 Tagen (ggf. leicht abweichender Wert), vorausgesetzt der Task bricht nicht wegen eines Memory Limit Fehler ab. Die 120 Tage können per yaml Datei manuell gesetzt werden. Einfach in GitHub nach der Konfiguration schauen oder hier um Forum müsste es auch stehen.
Weißt du noch Groß die Tabelle bei euch war?
Bei einem unserer Kunden wurden allein gestern in der Tabelle 15000 Einträge generiert, alle auch mit einem extrem großen Payload (ca. 400 KiB pro Zeile) und mit der CustomerID „NULL“.
Daher vermute ich, dass es sich in unserem Fall um Bots handelt, aber verstehe nicht warum es nur bei diesem einen Kunden auftritt…
Die Cart speichert jede Veränderung des Warenkorbs ab. Daher hat ein Kauf unter Umständen auch 10 Einträge. Die Carts werden nach x Tagen gelöscht (konfiguriert in der shopware.yaml)
Wenn es zu viele Einträge sind, kommt PHP nicht mehr damit klar und kann nicht mehr löschen. Dann geht es nur noch über den MySQL Server.
Ich würde dieses Thema hier gerne noch mal aufgreifen. Auch bei uns wird der Payload pro Zeile teilweise über einen Megabyte groß. Wir haben nun bereits die expire_days auf 7 Tage reduziert - und dennoch hat die Datenbank-Tabelle 195GB.
Hab ich hier jetzt ein Plugin, das querschießt, oder ist es normal, dass der Payload so groß wird?
Was ist schon normal? Wenn du täglich zehntausende Kunden/Bestellungen hast, mit jeweils viele Produkte im Warenkorb, dann kann das realistisch sein.
Weiterhin kann jedes Plugin x-beliebiges in den Payload schreiben. Theoretisch könnte ein Datenbankeintrag mehrere MB groß sein, je nachdem was im Payload gespeichert wird.
Daher schauen, wie viele einzelne Einträge existieren, auf wieviele Warenkörbe sich dies gruppieren lassen und zuletzt auch schauen, was im Payload steht und wie viele KB das jeweils sind.
Bei 195 GB kann die automatische Löschfunktion nicht mehr funktionieren. Schon bei 1 GB kann es kritisch werden (Erfahrung aus Kundenprojekten), je nach Server. Da hilft nur die Tabelle komplett zu leeren (https://dev.mysql.com/doc/refman/8.4/en/truncate-table.html) und danach zu schauen/testen, dass das automatische Löschen auch tatsächlich funktioniert.