MySQL-Suchen schneller machen mit Volltextindex

In der Regel werden Suchen mit dem MySQL LIKE erstellt. Das funktioniert in der Regel auch ausgezeichnet, solange die Datenbanktabelle nicht zu groß ist. Arbeitet man hingegen mit einer großen Datenbank (Millionen+ Einträge), dann merkt man schnell, wie lange eine Suche darin eigentlich dauert. Die Lösung lautet hier Volltextindex, zumindest in den meisten Fällen. Hier erfährst du, wie du eine bestehende Spalte für den Volltextindex bereitstellst und wie du mit wpdb eine Volltextsuche startest.

Spalte mit Volltextindex versehen

Um eine Spalte mit einem Volltextindex zu versehen, muss die Spalte mittels ALTER TABLE geändert werden. Hierfür überlegst du dir einen Namen für den Volltextindex und bestimmt im Zuge dessen direkt die betroffene Spalte. In der Regel verwendet man als Namen auch den Namen der Spalte. Kann man aber nennen, wie man möchte.

ALTER TABLE `meine_tabelle` ADD FULLTEXT INDEX `meine_spalte` (`meine_spalte`);Code-Sprache: JavaScript (javascript)

Hier haben wir jetzt die Spalte meine_spalte mit einem Volltextindex versehen. Bei einer großen Tabelle kann dies mehrere Sekunden, wenn auch Minuten, dauern. Das stellt in der Regel aber kein Problem dar, man muss hier nur geduldig sein.

Spalte mit Volltextindex durchsuchen

Bevor wir die Spalte mit einem Volltextindex versehen haben, haben wir mit der LIKE Anweisung innerhalb der Spalte gesucht. Das funktioniert grundsätzlich hervorragend, allerdings muss hier immer eine Wildcard gesetzt werden, damit auch alles durchsucht wird und dann wird auch wirklich alles in der Spalte gesucht. Deshalb ist es in großen Tabellen auch grundsätzlich langsamer als ein Volltextindex.

$wpdb->prepare("SELECT * FROM meine_tabelle WHERE meine_spalte LIKE '%%%s%%'", "Mein Suchwort");Code-Sprache: PHP (php)

Wichtig: Damit wir wpdb->prepare() verwenden können, schreiben wir statt %SuchWort%, %%SuchWort%%, damit das $wpdb->prepare() auch weiß, dass wir an dieser Stelle eine Wildcard verwenden. Sicherheitshalber sollte hier auch mit $wpdb->esc_like() gearbeitet werden. Ein Beispiel dafür:

$wpdb->prepare("SELECT * FROM meine_tabelle WHERE meine_spalte LIKE '%%%s%%'", $wpdb->esc_like("Mein Suchwort"));Code-Sprache: PHP (php)

Das funktioniert schon einwandfrei und führt auch nicht zu Problemen. Es wird nur irgendwann langsam. Du kannst, wenn du nicht mit Volltextindex arbeiten möchtest, auch die Tabellenart in eine InnoDB verändern. Die ist für größere Tabelle, was für schnellere Abfragen sorgt, aber u.a. die Befehle INSERT und UPDATE langsamer macht. Das kannst du selbst entscheiden.

Wie sieht unsere Suche jetzt mit einem Volltextindex aus? Recht ähnlich, wie du siehst:

$wpdb->prepare("SELECT * FROM meine_tabelle WHERE MATCH (meine_spalte) AGAINST ('%s' IN BOOLEAN MODE)", "Mein Suchwort");Code-Sprache: PHP (php)

So sieht die Suche mit Volltextindex aus. Du kannst hier auch wie gewohnt weitere logischere Operatoren wie AND oder OR setzen. Das ist alles kein Problem mit einem Volltextindex.

Beachte hierbei, dass du keine Wildcard benötigst. Die Volltextsuche funktioniert gänzlich ohne Wildcard.

Wann du keinen Volltextindex verwenden solltest

Die Volltextsuche ist langsamer als die Suche nach einem eindeutigen Begriff. Also wenn du bspw. in der post_id Spalte suchen willst und die ID hast, dann ist die normale Suche schneller. Einfach, weil du ja exakt etwas suchst und es exakt so in der Spalte steht.

Es gibt auch noch andere Beispiele und Fälle, wo es nicht so sinnvoll ist. Da dieser Beitrag aber mehr eine Gedankenstütze ist, belasse ich es jetzt dabei. Viel Erfolg und Spaß beim Coden!

Nützliche Links