Inhaltsverzeichnis
Spätestens wenn es um die Performance von WordPress und um eine Optimierung der Performance geht, kommt man später an den Punkt seine Datenbank zu optimieren. In diesem Beitrag geht es um eine spezielle und aufwendigere Methode, deine Datenbank aufzuräumen und zu optimieren.
Das Problem mit der Datenbank
Sobald du ein Plugin oder ein Theme installierst, werden in der Datenbank extra Tabellen angelegt und mit Daten gefüttert oder bestehende Tabellen dafür genutzt. Das ist auch vollkommen normal, da Einstellungen, Produkt-Keys und andere Sachen ja auch irgendwo gespeichert werden müssen.
Das Problem dabei ist, dass oftmals die Einstellungen und damit sehr viel Ballast nicht aus der Datenbank gelöscht werden. Ich hatte dazu mit WP-Optimize bereits einen Beitrag auf meinem Blog veröffentlicht, wo ich dieses Problem näher getestet habe.
Dabei wäre eine saubere Deinstallation sehr einfach durchzuführen. Nachfolgend habe ich einmal den Code eingeblendet, den ich nutze, um mein Plugin (immer noch in Entwicklung) sauber von WordPress zu deinstallieren.
<?php
// exit if accessed directly
if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) {
exit;
}
// drop database tables
global $wpdb;
$csgo_match_standings = $wpdb->prefix . "csgo_match_standings";
$csgo_match_gameday = $wpdb->prefix . "csgo_match_gameday";
$csgo_match_settings = $wpdb->prefix . "csgo_match_settings";
$csgo_match_plattform = $wpdb->prefix . "csgo_match_plattform";
$csgo_match_achievements = $wpdb->prefix . "csgo_match_achievements";
$sql_csgo_match_standings = "DROP TABLE IF EXISTS $csgo_match_standings";
$sql_csgo_match_gameday_table = "DROP TABLE IF EXISTS $csgo_match_gameday";
$sql_csgo_match_settings = "DROP TABLE IF EXISTS $csgo_match_settings";
$sql_csgo_match_plattform = "DROP TABLE IF EXISTS $csgo_match_plattform";
$sql_csgo_match_achievements = "DROP TABLE IF EXISTS $csgo_match_achievements";
$wpdb->query( $sql_csgo_match_standings );
$wpdb->query( $sql_csgo_match_gameday_table );
$wpdb->query( $sql_csgo_match_settings );
$wpdb->query( $sql_csgo_match_plattform );
$wpdb->query( $sql_csgo_match_achievements );
?>
Das sind 31 Zeilen und schon bleiben keine Rückstände deines Plugins in der Datenbank. Leider ist es oft der Fall, dass diverse Daten auch in der wp_options Tabelle hinterlegt werden. Diese Tabelle kann im Übrigen bei euch anders heißen, sofern ihr ein anderes Präfix nutzt.
Das Problem dabei ist, dass ein Plugin wie WP-Optimize nur einzelne Tabellen löschen kann und keine Datensätze im Einzelfall. Aber was ist die wp_options Tabelle eigentlich?
Die wp_options Tabelle
Die Tabelle speichert diverse Seiteneinstellungen. Dazu zählen neben Seitentitel, die Admin-URL, die Admin-E-Mail, Beiträge pro Seite auch diverse weitere Standardeinstellungen. Ich glaube, ihr versteht das Prinzip der Tabelle.
Bedauerlicherweise werden in dieser Tabelle eben auch Einstellungen von Themes, Widgets und Plugins gespeichert, welche sich nur sehr schwer entfernen lassen und somit diese Tabelle und damit die gesamte Datenbank – gerade über einen längeren Zeitraum – zumüllen.
Das Problem dabei ist die autoload Spalte. Diese wird mit einem Ja-Wert (yes) oder Nein-Wert (no) gespeist, welche direkt bestimmt, ob die dort abgespeicherten Daten mittels wp_load_alloptions() geladen werden. Diese Daten werden auf jeder einzelnen WordPress Seite geladen, was natürlich gerade auf lange Sicht an deiner Seiten-Performance kratzt.
So räumst du auf
Eines möchte ich direkt im Voraus verraten. In meinem Beispiel hatte ich vor der Optimierung dieser Tabelle über die Datenbank-Verwaltung meines Hosters 28 Seiten mit 1353 Datensätzen. Nach meiner Optimierung waren es noch 17 Seiten mit 811 Datensätzen. Das bedeutet, dass über 40 % der Datensätze in meiner wp_options Tabelle nur Ballast waren! Optimiert habe ich nur Datensätze, welche automatisch geladen werden.
Zuallererst solltest du definitiv ein Backup deiner Website machen. Das kannst du entweder bequem über deinen Hoster machen oder du nutzt ein Plugin für diesen Prozess. Eigentlich sollte dabei nichts kaputtgehen, allerdings möchten wir natürlich abgesichert sein.
Öffnen wir im nächsten Schritt phpMyAdmin oder das Standard-Panel für die MySQL-Datenbank eures Hosters. RAIDBOXES hat (wie im Bild zu sehen) ein eigenes Panel, was bedeutet, dass meine Anleitung etwas von eurem abweichen kann. Das Prinzip ist allerdings das Gleiche!
Ich habe selbstverständlich mein Tabellen-Präfix unkenntlich gemacht. Wir werden uns zwar per Hand durch jede einzelne Seite klicken, allerdings müssen wir nicht jeden Eintrag einzeln löschen, sondern werden uns mithilfe von SQL-Befehlen Abhilfe schaffen.
Natürlich wählen wir erstmal die Tabelle wp_options aus. Anschließend navigieren wir durch die einzelnen Seiten und Einträge, bis uns in der Spalte option_name ein Eintrag auffällt, welcher dort eigentlich nichts zu suchen hat. Das kann zum Beispiel der Name eines vor Ewigkeiten deinstallierten Themes oder Plugins sein.
In meinem Beispiel wäre das zum Beispiel der Eintrag theme_mods_profitmag. Profitmag ist hierbei ein altes Theme, welches ich zu Testzwecken vor über einem halben Jahr einmal installiert hatte. Nun möchte ich sämtliche Einträge mit diesem Namen finden.
Dafür suchen wir eine Funktion in eurem Admin-Panel, die es euch erlaubt SQL-Commands auszuführen. Sofern ihr diesen Bereich gefunden habt, öffnet ihr diesen in einem 2. Tab, sodass ihr nur die Tabs wechseln müsst.
Anschließend suchen wir mit simplen SQL-Abfragen in der Datenbank nach weiteren Einträgen mit dem String profitmag in der Spalte option_name. Angezeigt werden uns nur Daten, welche automatisch von WordPress geladen werden.
SELECT * FROM `wp_options` WHERE `autoload` = 'yes' AND `option_name` LIKE '%profitmag%'
Anschließend werden uns sämtliche (3) Einträge angezeigt, welche gefunden werden. Natürlich wollen wir diese Einträge löschen. Dazu passen wir den SQL-Code nur geringfügig an und lassen diesen wieder durch die Datenbank interpretieren.
DELETE FROM `wp_options` WHERE `autoload` = 'yes' AND `option_name` LIKE '%profitmag%'
Anschließend wurden alle Datensätze des alten Themes und damit auch die letzten Überbleibsel aus meiner WordPress-Datenbank entfernt.
Diesen Prozess wiederholt ihr für die gesamte Tabelle. Ich kann euch versprechen, dass es sich nach mehr Arbeit anhört, als es eigentlich ist und schnell vonstattengeht. Notwendig ist es leider auch.
Ich habe bestimmt Rückstände von 10 bis 15 verschiedenen Plugins und locker 5 bis 10 Themes gefunden, welche mal installiert waren. Alleine vom Plugin Real Cookie Banner waren noch 200 Datensätze in meiner wp_options Tabelle versteckt und wurden auf jeder Seite geladen.
Abschließend solltest du mit WP-Optimize oder einem ähnlichen Plugin regelmäßig abgelaufene transiente Optionen und anderes bereinigen. Das kann man dort ganz bequem machen, ohne auf die Datenbank per Hand zuzugreifen. Ich hoffe, dass euch dieser Beitrag gefallen hat. Bis zum nächsten Mal – euer Maurice!
Hallo Maurice,
Danke für deinen Beitrag! Endlich mal eine Beschreibung der ich sehr gut folgen konnte. Auch der Hinweis auf WP Optimize war sehr hilfreich! Ich betreue die Seite eines Bekannten und fand in der Datenbank Einträge mit denen ich nur wenig anfangen konnte. Jetzt ist mir vieles viel klarer!
Hab die Änderungen vorerst auf einer Staging-Seite ausprobiert … dann geht es die Tage an die richtige Seite 🙂
Danke!
Mit freundlichen Grüßen – Jan
Hallo Jan,
vielen Dank für deinen Kommentar und das Lob.
Solange alles auf der Staging-Seite funktioniert, sollte es auch bei der Live-Seite so funktionieren! Ansonsten einfach das Backup nutzen.
LG
Maurice
Hallo Maurice,
ich bin gerade an der OP 😉 Und hoffe es klappt wie auf der Staging-Seite.
Wie du ja bereits weiter oben in deinem Beitrag geschrieben hast … Plugins hinterlassen bei der Deinstallation leider manchmal Reste in der DB die man eigentlich nicht erwartet.
In meiner DB wurde von einem Vorgänger ziemlich viel probiert und entsprechende Hinterlassenschaften hoffe ich nun entfernen zu können. Wobei ich allerdings nicht immer erkennen kann ob es wirklich Hinterlassenschaften von Plugins sind … da ich diese ja nicht selbst installiert hatte.
Ich sehe da z.B noch jede Menge an Einträgen zu ehemaligen Seiten, die es so gar nicht mehr gibt. Folge ich der URL in der Datenbank … werde ich auf die Hauptseite umgeleitet. Solche Einträge müsste ich wohl auch manuell über die DB bereinigen können?
Mit WP Optimize hab ich allerdings beim cachen Probleme. Es flutscht alles … aber meine Seiten enthalten auch Umlaute, also Ää Öö etc. Und diese sind danach verstümmelt. Bei WPFastcache passiert mir das nicht, weshalb ich diesen erst mal weiter für das cachen einsetze. Hast du eine Idee woran das liegen könnte?
Mit freundlichen Grüßen – Jan
Hallo Jan,
also, sofern WP-Optimize dir nicht anzeigt, welche Tabellen zu alten (nicht installierten) Plugins gehören, kannst du diese Einträge einfach googeln. Relativ häufig bekommt man dann Ergebnisse aus Supportforen der jeweiligen Plugins, wo mit diesen Tabellennamen usw. um sich geworfen wird.
Ja, dann kann es sein, dass manuell oder über ein Plugin sämtliche 404 Einträge (siehe Verlinkung) automatisch zur Startseite umgeleitet werden. Du kannst hier ebenfalls über phpMyAdmin nach diesen Ausdrücken (Links) suchen, oder du nutzt das Plugin Broken Link Checker. Ein besseres Plugin gibt es nicht, um tote Links ausfindig zu machen. Die musst du anschließend nur aus den jeweiligen Beiträgen oder Seiten entfernen.
Ich denke, dass es sich hierbei um eine ältere Version von WordPress handeln könnte bzw. eine falsch konfigurierte Datenbank? Ich hab ein wenig gegoogelt und die Ergebnisse scheinen meinen Verdacht zu bestätigen. Vielleicht hilft dir diese Anleitung weiter, ich finde sie sehr hilfreich und umfangreich.
Ich hoffe, ich konnte dir weiterhelfen.
Liebe Grüße
Maurice