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!

Datenbank RAIDBOXES

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!

Möchtest du immer aktuell bleiben und automatisch über neue Beiträge informiert werden? Dann melde dich doch für meinen kostenfreien Newsletter an!

DSGVO (Pflichtfeld) *

Categorized in: