Zum Hauptinhalt springen

Gezielte Datenbank-Optimierung bringt bei gewachsenen WordPress-Sites oft mehr als jedes Cache-Plugin. Langsame WordPress-Sites leiden oft an einer aufgeblähten Datenbank: zu viele autoloadete Optionen, verwaiste Transients, riesige Postmeta-Tabellen oder ein überlasteter WP-Cron.

Autoload-Optionen

Optionen mit Autoload werden bei jedem Request geladen. Plugins speichern dort teils Megabytes an Daten. WordPress warnt im Website-Zustand, wenn die Gesamtgrösse zu gross wird. Seit 6.6 kennt WordPress zusätzlich die Autoload-Werte on/off/auto und setzt sehr grosse Optionen automatisch nicht mehr auf Autoload.

# Gesamtgrösse
wp db query "SELECT ROUND(SUM(LENGTH(option_value))/1024) AS kb FROM wp_options WHERE autoload IN ('yes','on','auto-on','auto');"
# Die grössten Kandidaten
wp db query "SELECT option_name, ROUND(LENGTH(option_value)/1024) AS kb, autoload FROM wp_options WHERE autoload IN ('yes','on','auto-on','auto') ORDER BY LENGTH(option_value) DESC LIMIT 20;"

Zielwert: deutlich unter 800 KB, ideal unter 300 KB. Optionen deinstallierter Plugins löschen, grosse und selten gebrauchte Optionen auf off setzen:

wp option set-autoload grosse_plugin_option off

Transients

Transients sind temporäre Cache-Werte. Ohne persistenten Object Cache liegen sie in wp_options und abgelaufene bleiben liegen, bis sie abgefragt werden.

wp transient delete --expired
wp transient list --format=count

Mit Redis landen Transients im Object Cache statt in der Datenbank. Das ist ein weiterer Grund für einen persistenten Object Cache.

Postmeta und Revisionen

  • Revisionen begrenzen: define( 'WP_POST_REVISIONS', 10 ); und alte bereinigen (z. B. mit WP-CLI-Paketen oder einem Wartungs-Plugin, nach Backup).
  • Verwaiste Meta-Einträge (Postmeta ohne Beitrag) entfernen.
  • WooCommerce: HPOS (High-Performance Order Storage) aktivieren. Bestellungen liegen dann in eigenen Tabellen statt in wp_posts/wp_postmeta.
  • Action Scheduler (wp_actionscheduler_*) wächst bei Shops schnell; abgeschlossene Aktionen regelmässig aufräumen.

Indizes und langsame Queries

  • Slow Query Log in MySQL/MariaDB aktivieren (long_query_time = 1) und auswerten.
  • Query Monitor zeigt langsame und doppelte Queries mit verursachender Komponente.
  • meta_query auf meta_value ist teuer, weil die Spalte nicht sinnvoll indiziert ist. Für häufige Abfragen eigene Tabellen oder Taxonomien verwenden.
  • Das Plugin Index WP MySQL For Speed ergänzt bessere Indizes für Core-Tabellen. Hilfreich bei grossen Datenbanken, vorher Backup.

WP-Cron

WP-Cron läuft standardmässig bei Seitenaufrufen. Bei wenig Traffic laufen Jobs zu spät, bei viel Traffic zu oft und blockierend. Besser: per System-Cron auslösen.

// wp-config.php
define( 'DISABLE_WP_CRON', true );
# crontab
*/5 * * * * cd /var/www/example && wp cron event run --due-now --quiet

Regelmässig wp cron event list prüfen: Events von deinstallierten Plugins, Events mit sehr kurzen Intervallen oder solche, die ständig überfällig sind, deuten auf Probleme hin.

Tabellen-Engine und Charset

Alle Tabellen sollten InnoDB und utf8mb4 verwenden. Alte MyISAM-Tabellen konvertieren (nach Backup): ALTER TABLE wp_xyz ENGINE=InnoDB;

Weiterführende Artikel

Quellen und Dokumentation