Shop direkt in der Datenbank entschlacken

Thema wurde von ff-webdesigner, 27. Oktober 2023 erstellt.

  1. ff-webdesigner

    ff-webdesigner Erfahrener Benutzer

    Registriert seit:
    22. Januar 2014
    Beiträge:
    524
    Danke erhalten:
    47
    Danke vergeben:
    59
    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örbe

    DELETE 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 attribute
    DELETE 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 = kundengruppenpreise
    DELETE 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");

    // produktattribute
    DELETE 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");
       
    // produktinhalte
    DELETE 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");
       
    // produktbeschreibungen
    DELETE 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");
       
    // staffelpreise
    DELETE 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");
       
    //produktbilder
    DELETE 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 produkte
    DELETE 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 produkte
    DELETE 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. produktnummern
    DELETE 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-benachrichtigungen
    DELETE 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 produkte
    DELETE 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 selling
    DELETE 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");
       
    // bewertungen
    DELETE 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 gesetzt
    DELETE FROM products WHERE products_quantity "0.000" AND products_date_added <= "2022-12-31 23:59:59");

    // zustimmungen zu datenschutz
    DELETE FROM agreements WHERE date_added <= "2022-12-31 23:59:59";

    // gespeicherte kunden ip adressen
    DELETE FROM customers_ip WHERE customers_ip_date <= "2022-12-31 23:59:59";

    // referenzierung email-anhänge
    DELETE FROM email_attachments WHERE email_id IN (SELECT email_id FROM emails WHERE  creation_date <= "2022-12-31 23:59:59");

    // email-empfänger
    DELETE 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";

    // rechnungen
    DELETE FROM invoices WHERE invoice_date <= "2022-12-31 23:59:59";

    // bestellungen
    DELETE 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";

    // lieferscheine
    DELETE FROM packing_slips WHERE date <= "2022-12-31 23:59:59";

     
  2. tannenhof_imshausen

    tannenhof_imshausen Erfahrener Benutzer

    Registriert seit:
    26. Oktober 2022
    Beiträge:
    95
    Danke erhalten:
    26
    Danke vergeben:
    40
    #2 tannenhof_imshausen, 28. Oktober 2023
    Zuletzt bearbeitet: 30. Oktober 2023
    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 leeren
    UPDATE `emailsSET `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 bereinigen
    DELETE FROM emails
    WHERE
        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_contacts
    WHERE
        email_id NOT IN
        
    (SELECT DISTINCT email_id FROM emails)

    // Bestellbestätigungs-eMails aus orders-Tabelle löschen
    UPDATE `ordersSET `gm_order_html` = '' WHERE (`orders_id` > 1);
    UPDATE `ordersSET `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.)
     
  3. ff-webdesigner

    ff-webdesigner Erfahrener Benutzer

    Registriert seit:
    22. Januar 2014
    Beiträge:
    524
    Danke erhalten:
    47
    Danke vergeben:
    59
  4. tannenhof_imshausen

    tannenhof_imshausen Erfahrener Benutzer

    Registriert seit:
    26. Oktober 2022
    Beiträge:
    95
    Danke erhalten:
    26
    Danke vergeben:
    40
    Bitte bitte!
    Habs auch nicht unbedingt für Dich ergänzt, sondern für eventuelle Mitlesende. :)
     
  5. semmelweis

    semmelweis Erfahrener Benutzer

    Registriert seit:
    17. Juli 2020
    Beiträge:
    224
    Danke erhalten:
    18
    Danke vergeben:
    66
    @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
     
  6. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    3. Juni 2019
    Beiträge:
    500
    Danke erhalten:
    86
    Danke vergeben:
    38
    // 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
     
  7. tannenhof_imshausen

    tannenhof_imshausen Erfahrener Benutzer

    Registriert seit:
    26. Oktober 2022
    Beiträge:
    95
    Danke erhalten:
    26
    Danke vergeben:
    40
    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.
     
  8. Anonymous

    Anonymous Administrator
    Mitarbeiter

    Registriert seit:
    26. April 2011
    Beiträge:
    1.799
    Danke erhalten:
    1.400
    Danke vergeben:
    306
    @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.
     
  9. ff-webdesigner

    ff-webdesigner Erfahrener Benutzer

    Registriert seit:
    22. Januar 2014
    Beiträge:
    524
    Danke erhalten:
    47
    Danke vergeben:
    59
    neues thema bitte auch neuer thread.