Im ersten und zweiten Teil der Reihe „Magento Datenbank Optimierung“ haben wir uns die Log-Funktionen genauer angesehen. Dieses Mal wollen wir die Datenbank von allen unnötigen Einträgen befreien.
Als direkte Auswirkung der Optimierung sehen wir mehr freien Speicherplatz auf der Festplatte und einen reduzierten Bedarf an Arbeitsspeicher.
Das Problem der großen Tabellen
Eine optimale MySQL-Konfiguration sieht vor möglichst viele Abfragen aus dem sehr schnellen Arbeitsspeicher zu bearbeiten. Große Tabellen verhindern dies und zwingen den MySQL-Server temporäre Tabellen auf der vergleichsweisem „langsamen“ Festplatte abzulegen.
Besonders gut bemerkbar macht sich dieser Performanceverlust bei der core_session Tabelle wenn diese, aufgrund vieler Besucher und / oder falsch eingestellter Session Lebensdauer, sehr groß geworden ist. Die Tabelle wird bei jedem Seitenaufruf nach alten Sessions gescannt, kann der Server diese nicht aus dem Arbeitsspeicher bedienen muss auf die „langsame“ Festplatte zurückgegriffen werden. Die Abfragedauer steigt dadurch von wenigen Millisekunden auf mehrere Sekunden was die Auslieferung der Website ebenfalls um diese Zeit verzögert. – Die Seitenladezeit des Magento Shops steigt (meistens) ohne erkennbare Anzeichen wie steigende Besucherzahlen oder CPU-Auslastung immens an.
Die Leerung der Session-Tabelle ist im Query nicht berücksichtigt da dies die Warenkörbe der Besucher leeren würde, dennoch empfehlen wir die Tabelle ab einer Größe von 50 – 100 MB zu leeren.
Unnötigen Ballast entfernen
Backup nicht vergessen! 🙂
Die folgenden Tabellen können und sollten regelmäßig geleert (nicht gelöscht!!!) werden damit die Performance Eures Magento Shops nicht negativ beeinträchtig wird: aw_core_logger, catalog_compare_item, catalogindex_aggregation, catalogindex_aggregation_tag, catalogindex_aggregation_to_tag, dataflow_batch_export, dataflow_batch_import, index_event, log_customer, log_quote, log_summary, log_summary_type, log_url, log_url_info, log_visitor, log_visitor_info, log_visitor_online, report_event, report_viewed_product_index, report_compared_product_index’.
Markiert dazu in phpMyAdmin die o.g. Tabellen und wählt anschließend unten im Dropdown den Befehl „Leeren“ aus.
Alternativ könnt ihr folgendes Query direkt auf der MySQL-CLI oder mit Hilfe von phpMyAdmin über den Reiter „SQL“ abfeuern. – Achtet unbedingt auf die richtige Datenbank Auswahl und die korrekten Tabellennamen im SQL-Query!
TRUNCATE 'aw_core_logger'; TRUNCATE 'catalog_compare_item'; TRUNCATE 'catalogindex_aggregation'; TRUNCATE 'catalogindex_aggregation_tag'; TRUNCATE 'catalogindex_aggregation_to_tag'; TRUNCATE 'dataflow_batch_export'; TRUNCATE 'dataflow_batch_import'; TRUNCATE 'index_event'; TRUNCATE 'log_customer'; TRUNCATE 'log_quote'; TRUNCATE 'log_summary'; TRUNCATE 'log_summary_type'; TRUNCATE 'log_url'; TRUNCATE 'log_url_info'; TRUNCATE 'log_visitor'; TRUNCATE 'log_visitor_info'; TRUNCATE 'log_visitor_online'; TRUNCATE 'report_event'; TRUNCATE 'report_viewed_product_index'; TRUNCATE 'report_compared_product_index';
Die SQL-Befehle entfernen nicht mehr benötigte Daten aus den Tabellen und sorgen somit für eine rasante Ladezeit. Andere Prozesse, wie die Erstellung eines Backups, werden durch die kleinere Datenbank ebenfalls positiv beeinflusst, so verbrauchen die meisten Vorgänge wesentlich weniger Zeit und Ressourcen (Stichwort: Timeout). 🙂