Hallo beisammen, bei unserem mittlerweile über 10 Jahre alten Hochlast-Gambio haben mittlerweile 1,2Gb Daten in der Datenbank. Das führt selbst auf starkem Server zu deutlichen Performance Problemen in allen möglichen Bereichen. Ursache sind vor allem Emails (560MB), veraltete Produkte (800MB) und Bestellungen. In Anlehnung an den sehr schönen "Hilfreiche MySQL Befehle" Post habe ich mal ein paar MySQLs erarbeitet zum massiven entschlacken der Datenbank. Gambio bietet leider via Support keine Hilfe bei solchen Sachen, weiss ich. Dass das Vorgehen Gefahren birgt weiss ich auch. Aber vielleicht kann mir ein Power User Empfehlungen geben? Unser Shop läuft aktuell noch unter 3.12. Backup DB wird natürlich gemacht. Die Befehle sollten den Shop umfassend und zuverlässig entschlacken? Oder hat jemand bessere Ideen? PHP: // löschen aller Produkte mit Lagerbestand 0 vor 2023// warenkörbeDELETE FROM customers_basket WHERE products_id IN (SELECT products_id FROM products WHERE products_quantity = "0.000" AND products_date_added <= "2022-12-31 23:59:59");// warenkörbe attributeDELETE FROM customers_basket_attributes WHERE products_id IN (SELECT products_id FROM products WHERE products_quantity = "0.000" AND products_date_added <= "2022-12-31 23:59:59");//folgendes wiederholen für alle relevanten Kundengruppen = kundengruppenpreiseDELETE FROM personal_offers_by_customers_status_0 WHERE products_id IN (SELECT products_id FROM products WHERE products_quantity = "0.000" AND products_date_added <= "2022-12-31 23:59:59");// produktattributeDELETE FROM products_attributes WHERE products_id IN (SELECT products_id FROM products WHERE products_quantity = "0.000" AND products_date_added <= "2022-12-31 23:59:59"); // produktinhalteDELETE FROM products_content WHERE products_id IN (SELECT products_id FROM products WHERE products_quantity = "0.000" AND products_date_added <= "2022-12-31 23:59:59"); // produktbeschreibungenDELETE FROM products_description WHERE products_id IN (SELECT products_id FROM products WHERE products_quantity = "0.000" AND products_date_added <= "2022-12-31 23:59:59"); // staffelpreiseDELETE FROM products_graduated_prices WHERE products_id IN (SELECT products_id FROM products WHERE products_quantity = "0.000" AND products_date_added <= "2022-12-31 23:59:59"); //produktbilderDELETE FROM products_images WHERE products_id IN (SELECT products_id FROM products WHERE products_quantity = "0.000" AND products_date_added <= "2022-12-31 23:59:59");// mengeneinheiten der produkteDELETE FROM products_quantity_unit WHERE products_id IN (SELECT products_id FROM products WHERE products_quantity = "0.000" AND products_date_added <= "2022-12-31 23:59:59");// hermes paketgrössen der produkteDELETE FROM products_hermesoptions WHERE products_id IN (SELECT products_id FROM products WHERE products_quantity = "0.000" AND products_date_added <= "2022-12-31 23:59:59");// iban, ean, jan etc. produktnummernDELETE FROM products_item_codes WHERE products_id IN (SELECT products_id FROM products WHERE products_quantity = "0.000" AND products_date_added <= "2022-12-31 23:59:59"); // verfügbarkeits-benachrichtigungenDELETE FROM products_notifications WHERE products_id IN (SELECT products_id FROM products WHERE products_quantity = "0.000" AND products_date_added <= "2022-12-31 23:59:59"); // kategoriezuordnung produkteDELETE FROM products_to_categories WHERE products_id IN (SELECT products_id FROM products WHERE products_quantity = "0.000" AND products_date_added <= "2022-12-31 23:59:59");// was genau ist categories_index? nochmalige zuordnung produkte > kategorien?DELETE FROM categories_index WHERE products_id IN (SELECT products_id FROM products WHERE products_quantity = "0.000" AND products_date_added <= "2022-12-31 23:59:59"); // cross sellingDELETE FROM products_xsell WHERE products_id IN (SELECT products_id FROM products WHERE products_quantity = "0.000" AND products_date_added <= "2022-12-31 23:59:59"); // bewertungenDELETE FROM reviews WHERE products_id IN (SELECT products_id FROM products WHERE products_quantity = "0.000" AND products_date_added <= "2022-12-31 23:59:59");// ganz am schluss die produkte selbst löschen, hier werden primär p_ids gesetztDELETE FROM products WHERE products_quantity = "0.000" AND products_date_added <= "2022-12-31 23:59:59");// zustimmungen zu datenschutzDELETE FROM agreements WHERE date_added <= "2022-12-31 23:59:59";// gespeicherte kunden ip adressenDELETE FROM customers_ip WHERE customers_ip_date <= "2022-12-31 23:59:59";// referenzierung email-anhängeDELETE FROM email_attachments WHERE email_id IN (SELECT email_id FROM emails WHERE creation_date <= "2022-12-31 23:59:59");// email-empfängerDELETE FROM email_contacts WHERE email_id IN (SELECT email_id FROM emails WHERE creation_date <= "2022-12-31 23:59:59");// zuletzt emails vor 2023 löschen - sollte eigentlich das gleiche machen wie der button im admin - der geht bei uns nicht mehr.DELETE FROM emails WHERE creation_date <= "2022-12-31 23:59:59";// das sollten die benachrichtigungen im admin sein? bie uns nette 100k einträge...DELETE FROM infobox_messages_description WHERE infobox_messages_id IN (SELECT infobox_messages_id FROM infobox_messages WHERE date_added <= "2022-12-31 23:59:59");DELETE FROM infobox_messages WHERE date_added <= "2022-12-31 23:59:59";// rechnungenDELETE FROM invoices WHERE invoice_date <= "2022-12-31 23:59:59";// bestellungenDELETE FROM orders_products WHERE orders_id IN (SELECT orders_id FROM orders WHERE date_purchased <= "2022-12-31 23:59:59");DELETE FROM orders_total WHERE orders_id IN (SELECT orders_id FROM orders WHERE date_purchased <= "2022-12-31 23:59:59");DELETE FROM orders_status_history WHERE orders_id IN (SELECT orders_id FROM orders WHERE date_purchased <= "2022-12-31 23:59:59");DELETE FROM orders WHERE date_purchased <= "2022-12-31 23:59:59";// lieferscheineDELETE FROM packing_slips WHERE date <= "2022-12-31 23:59:59";
Folgende Befehle setze ich zum Aufräumen der eMails bei Gambio 4.8.0.2, wäre sinnvoller Weise auszuführen nach dem zeitabhängigen Löschen von oben: PHP: // HTML-Version leerenUPDATE `emails` SET `content_html` = '' WHERE (`email_id` > 1);// eMails mit Absender und Empfänger vom Shop löschen, shop@example.org durch die verwendete Adresse ersetzen; anschließend email_contacts bereinigenDELETE FROM emailsWHERE email_id IN ( SELECT DISTINCT email_id FROM email_contacts WHERE email_id IN (SELECT email_id FROM email_contacts WHERE email_address = 'shop@example.org' AND contact_type = 'recipient' ) AND email_id IN (SELECT email_id FROM email_contacts WHERE email_address = 'shop@example.org' AND contact_type = 'sender' ) );DELETE FROM email_contactsWHERE email_id NOT IN (SELECT DISTINCT email_id FROM emails)// Bestellbestätigungs-eMails aus orders-Tabelle löschenUPDATE `orders` SET `gm_order_html` = '' WHERE (`orders_id` > 1);UPDATE `orders` SET `gm_order_txt` = '' WHERE (`orders_id` > 1); Code: WHERE (`orders_id` > 1) bzw. Code: WHERE (`email_id` > 1) habe ich verwendet, wenn in MySQL Workbench die Option Safe Updates (rejects UPDATEs and DELETEs with no restrictions) aktiv ist. Das Kommentarzeichen für SQL ist übrigens „-- “, also wie der Signaturtrenner bei eMails. Hier nur // verwendet, damit die Syntax-Hervorhebung im Codeblock funktioniert. (Bei Rechnungen die 10-Jahres-Aufbewahrungsfrist beachten.)
@ff-webdesigner danke für die coolen SQL Querys. Kannst du uns sagen wie wir für sehr viele Produkte einer Kategorie die Artikelfilter wie z.B. Farbe, Größe usw. setzen können? Über Export / Import mittels csv hat das nicht geklappt. Danke
// Bestellbestätigungs-eMails aus orders-Tabelle löschen UPDATE `orders` SET `gm_order_html` = '' WHERE (`email_id` > 1); UPDATE `orders` SET `gm_order_txt` = '' WHERE (`email_id` > 1); Unbekanntes Tabellenfeld 'email_id' in where clause
Ups, das war ein Copy&Paste-Fehler, habs oben korrigiert. Muss in der Orders-Tabelle natürlich Code: WHERE (`orders_id` > 1) heißen. Aber wie oben geschrieben nur relevant bei aktiver Safe Updates Einstellung.
@tannenhof_imshausen Die E-Mails werden mit dem kommenden Update 4.9.1.0 auch aus der Tabelle orders komplett entfernt. Die Spalten werden gelöscht. Die E-Mails werden dann nicht mehr bei jeder Bestellung gespeichert, sondern sind dann nur noch in der emails Tabelle. Also keine doppelte Speicherung mehr.