Shopware 6 Performance Blog

Shopware 6 MySQL Performance – Meine Tipps und Best Practices

Shopware 6 ist bereits im Standard eine leistungsstarke E-Commerce-Plattform, die Unternehmen Flexibilität und Skalierbarkeit bietet. Mit zunehmendem Datenverkehr und wachsender Datenmenge in deinem Shop wird die Leistung Deines MySQL-Datenbankservers jedoch entscheidend für den Erfolg deines Onlineshops. In diesem Blog-Beitrag erfährst Du, wie Du die MySQL-Performance in Shopware 6 durch Optimierung und Best Practices verbessern kannst 😊

Die Wahl des richtigen Hosting-Setups – Die Grundlage für Deinen Erfolg

Das Hosting-Setup spielt eine entscheidende Rolle für die Performance und Stabilität Deines Shopware 6 Shops. Die optimale Lösung hängt dabei stark von der Größe und den Anforderungen Deines Shops ab.

Für kleine Shops und Einsteiger: Shared Hosting Für Shops, die gerade erst starten, kann ein Shared-Hosting-Setup eine kostengünstige Option sein. Allerdings leidet darunter oft die Performance, da die Server-Ressourcen mit anderen Websites geteilt werden. Dies kann insbesondere bei wachsendem Traffic schnell zu Problemen führen.

Unser Tipp für professionelle Shops: Eigener Server Für ambitionierte und professionell geführte Shops empfehlen wir Dir mindestens einen eigenen Server. Ein dedizierter Server bietet genügend Ressourcen und eine höhere Zuverlässigkeit, um den wachsenden Anforderungen gerecht zu werden. Dies sorgt nicht nur für bessere Performance, sondern auch für mehr Kontrolle über die Serverumgebung.

Eine genaue Empfehlung für CPU-Kerne und RAM kann ich an dieser Stelle nicht geben. Sprecht hierzu am besten mit Eurem Hoster. Jeder gute Hoster kann auf Basis Eurer Besucherzahlen Empfehlungen aussprechen und sie ggf. korrigieren, sollten mehr oder weniger benötigt werden.

Für wachsende Shops: Dedizierter Datenbank-Server Ab einer bestimmten Shopgröße und bei steigenden Transaktionsvolumina ist es ratsam, die Datenbank auf einem separaten Server auszulagern. Dies entlastet den Hauptserver und führt zu einer spürbaren Performance-Steigerung.

Für große Shops: Cluster-Setup Für sehr große Shops oder Unternehmen mit extrem hohem Traffic und komplexen Anforderungen ist ein Cluster-Setup die beste Wahl. Hier wird die Last auf mehrere Server verteilt, was sowohl die Performance als auch die Ausfallsicherheit maximiert.

MySQL-Version

Als Grundlage empfehlen wir, mindestens MySQL 8 zu verwenden. MySQL 8 bietet erhebliche Verbesserungen in Bezug auf Leistung, Sicherheit und moderne SQL-Funktionen. Im Vergleich zu älteren Versionen bringt MySQL 8 zahlreiche neue Features mit, wie z. B. erweiterte JSON-Unterstützung, Window Functions, Common Table Expressions (CTEs) und Verbesserungen in der InnoDB-Storage-Engine, die Deinen Shop zukunftssicher und effizienter machen. Um eine stabile und performante Datenbankumgebung zu gewährleisten, sollte MySQL 8 als Mindestanforderung gesetzt werden.

Prüfen kannst Du Deine Version ganz simpel in z.B. phpMyAdmin mit folgendem SQL-Query:

SELECT VERSION();
mysql-version

MySQL vs MariaDB

MySQL und MariaDB sind beides relationale Open-Source-Datenbanksysteme, die ursprünglich auf demselben Quellcode basieren. MariaDB entstand als Abspaltung (Fork) von MySQL, nachdem Oracle die Rechte an MySQL übernommen hatte. Beide Systeme haben sich seitdem unterschiedlich weiterentwickelt, und es gibt einige Unterschiede in Bezug auf Funktionen, Performance und Kompatibilität.

Welches Datenbanksystem für Dich das Richtige ist, solltest Du mit Deinem Hoster besprechen. Shopware und wir empfehlen hierbei auf MySQL 8 zu setzen, weil MySQL unserer Meinung nach besser mit JSON-Feldern – vor allem beim Suchen – umgehen kann.

Solltest Du Dich entscheiden, Elasticsearch einzusetzen, ist es aber eigentlich egal, welches System Du nutzt, da die Such-Querys dann nicht mehr über die Datenbank laufen.

InnoDB Buffer Pool

Der InnoDB Buffer Pool ist einer der wichtigsten Speicherbereiche in der MySQL-Datenbank, speziell für die InnoDB-Storage-Engine, welche bei Shopware 6 eigentlich standardmäßig genutzt wird. Er fungiert als Zwischenspeicher (Cache) für Daten und Indexe, die aus den Datenbanktabellen geladen werden. Wenn Du auf Daten in der Datenbank zugreifst, werden diese in den Buffer Pool geladen, damit sie bei weiteren Zugriffen schnell aus dem Speicher und nicht direkt von der Festplatte abgerufen werden müssen.

Hier sind die wichtigsten Funktionen des InnoDB Buffer Pools:

  1. Caching von Daten: Der Buffer Pool speichert oft abgerufene Daten, was die Lesegeschwindigkeit erheblich steigert, da Zugriffe auf den Arbeitsspeicher viel schneller sind als Zugriffe auf die Festplatte.
  2. Caching von Indexen: Neben den Daten speichert der Buffer Pool auch Indexe, was die Abfragegeschwindigkeit erhöht, besonders bei komplexen JOIN- oder WHERE-Abfragen.
  3. Schreiboperationen verzögern: InnoDB speichert auch geänderte Daten im Buffer Pool und schreibt diese nicht sofort auf die Festplatte. Dies verbessert die Performance, da die Festplattenzugriffe reduziert werden. Die geänderten Daten werden in einem späteren Schritt, dem sogenannten Flushing, auf die Festplatte geschrieben.

InnoDB Buffer Pool konfigurieren

Wenn der InnoDB Buffer Pool zu klein ist, müssen Daten häufiger von der Festplatte geladen werden, was zu einer erheblichen Verlangsamung der Datenbank führt. Für eine optimale Performance sollte der Buffer Pool daher mindestens so groß sein wie die Datenbank selbst, damit alle Daten zwischengespeichert werden können. Im besten Fall sogar etwas größer, um Luft für Wachstum zu lassen.

Bei einigen Kunden gibt es allerdings Tabellen, die enorm groß werden (z.B. die cart-Tabelle, welche bei Shopware je nach Kundengröße oft im zweistelligen GB-Bereich liegt). Für viele Kunden macht es keinen Sinn, die Pool Size so groß einzustellen, dass wirklich alle Daten reinpassen, da viele Datensätze nicht immer aktiv genutzt werden. Alte Bestellungen sind vielleicht ab und zu für das Erstellen von Statistiken wichtig, müssen aber nicht ständig im Zwischenspeicher verfügbar sein.

Um eine optimale Balance aus Performance und Kosten zu erhalten, prüfe ich bei unseren Kunden daher eigentlich immer, ob alle aktiv genutzten Daten in den Pool passen.

Die Größe des Pools kannst Du über die Variable innodb_buffer_pool_size in Deiner MySQL-Config File einstellen. Sprich hierzu am Besten mit Deinem Hoster, der die Einstellung für Dich übernehmen kann.

Beispiel: size auf 8GB stellen

innodb_buffer_pool_size=8589934592

innodb_log_file_size

Die innodb_log_file_size ist ein wichtiger Konfigurationsparameter in MySQL, der die Größe der InnoDB-Logdateien festlegt. Diese Logdateien sind Teil des InnoDB-Transaktionsprotokolls und spielen eine wesentliche Rolle bei der Verwaltung von Transaktionen und der Datenintegrität. Eine gut abgestimmte Logdateigröße kann die Performance Deines MySQL-Servers erheblich verbessern, während eine zu kleine Größe die Schreibperformance beeinträchtigen kann.

Doe optimale Größe sollte hierbei im Verhältnis zur innodb_buffer_pool_size stehen. Am besten besprichst Du Dich hier ebenfalls mit Deinem Hoster. Wir empfehlen ab 8GB Pool size eine Log-Size von ca. 2GB. Größer als 2GB solltest Du hier aber nicht gehen, da ein ein Neustart bei einem Crash der Datenbank sonst erheblich länger dauert.

innodb_buffer_pool_instances

Der Parameter innodb_buffer_pool_instances in MySQL legt fest, in wie viele Instanzen der InnoDB Buffer Pool aufgeteilt wird.

Bei Setups mit genügend RAM empfehlen wir, die Variable auf 8 zu setzen. Diese Einstellung ist nur bei MySQL sinnvoll, bei MariaDB aber nicht.

sql_mode

sql_mode in MySQL ist eine Konfigurationsvariable, die das Verhalten des MySQL-Servers in verschiedenen Situationen steuert. Sie bestimmt, wie MySQL mit bestimmten SQL-Syntaxregeln, Datenvalidierung und Fehlern umgeht.

In vielen Hosting-Setups enthält diese Variable das Wort “ONLY_FULL_GROUP_BY”. Dieser Modus erfordert, dass alle nicht aggregierten Spalten in einer SELECT-Klausel auch in der GROUP BY-Liste enthalten sind.

Um mit möglichst vielen Systemen kompatibel zu sein, führt Shopware vor jedem Datenbank-Query einen weiteren Query aus, um “ONLY_FULL_GROUP_BY” aus der sql_mode Variable zu entfernen. Dieses Verhalten macht uns die initiale Einrichtung des Shops leichter, ist aber schlechter für die allgemeine Auslastung der Datenbank.

Für eine optimale Performance lohnt es sich, mit dem Hoster zu sprechen, um “ONLY_FULL_GROUP_BY” nachhaltig aus der sql_mode Variable zu löschen.

Ist das erreicht, kann über SQL_SET_DEFAULT_SESSION_VARIABLES=0 in der .env Datei der überflüssige Query, welcher die sql_mode Variable normalerweise bereinigt, deaktiviert werden.

Fazit der allgemeinen Optimierungen

Shopware 6 ist eine leistungsstarke E-Commerce-Plattform, deren Performance stark von einer optimierten Datenbank abhängt. Der wichtigste Punkt ist meiner Meinung nach der richtige Hoster, welcher im Idealfall viele unserer Empfehlungen direkt berücksichtigt und auch bei Problemen beraten kann. Wir arbeiten hierbei sehr gerne mit Maxcluster zusammen.

Neben dem richtigen Hoster, der die meisten Konfigurationen richtig konfiguriert, würde ich wahrscheinlich den InnoDB Buffer Pool als wichtigsten Punkt sehen, den jeder gute Entwickler bei seinen Shops prüfen sollte.

Neben MySQL ist die Performance von PHP entscheiden für schnelle Ladezeiten in Deinem Onlineshop. Erfahre hier, wie Du Deine PHP-Performance aufs nächste Level bringen kannst 😊

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert