2012-04-28 12 views
6

Ich habe eine Tabelle (MySQL 5.1, InnoDB) mit etwa 3M Reihen, 98% von ihnen bestehen nur aus einem Wort. Wenn ich eine Abfrage mit LIKE %searchterm% ausführen, ist es viel zu langsam.MySQL: (Volltext/Index) Suche auf "One-Word-Spalten"

Da es SELECT Abfragen nur für diese Tabelle gibt, habe ich darüber nachgedacht, es in MyISAM umzuwandeln (wie InnoDB noch nicht unterstützt, oder nur für Version 5.6+, unterstützt FULLTEXT).

Allerdings frage ich mich, ob dies die Abfrage wirklich beschleunigen würde, denn soweit ich weiß ist ein FULLTEXT-Index eine Tabelle mit aufgeteilten Wörtern ("Hallo sonniger Tag" -> "Hallo", " sonniger "," Tag "), wenn es also nur einzelne Wörter pro Spalte gibt, würde es einen Sinn ergeben?

Würde es Abfragen beschleunigen, wenn ich einen normalen Index auf diese Textspalte setzen würde?

Vielen Dank im Voraus für Ihre Hilfe!

Antwort

3

Die Verwendung eines FULLTEXT-Index würde helfen. Es teilt den Text in Wörter auf, indiziert dann auch diese Wörter. Diese Indexierung beschleunigt die Abfrage. Aber Sie müssen die full-text search functions, und nicht LIKE verwenden, um den Index zu nutzen.

Ein normaler Index wird Ihnen nicht helfen. Eine LIKE-Klausel kann nur dann einen Index nutzen, wenn sie ein konstantes Präfix hat.

  • yourcolumn LIKE 'searchterm%' würde den Index verwenden.
  • yourcolumn LIKE '%searchterm%' würde den Index nicht verwenden.
+0

Wow, danke für die Erklärung und das Beispiel! Vielen Dank, Mark! – Chris

0

Stellt die Volltextsuche oder der Volltextindex irgendwelche Nachteile für Sie dar? Persönlich vermisste ich die Suche nach Teil eines Wortes wie "Array" in "ByteArray".

können Sie den Ansatz berücksichtigen, dass ich hier vorstellen:

https://stackoverflow.com/a/22531268/543814

Die Idee, jede mögliche Suffix einer Zeichenfolge zu speichern ist.

Dies erfordert mehr Speicherplatz, abhängig von Ihren Stringlängen.

Im Gegenzug erhalten Sie einen normalen Index für diese Abfragen zu verwenden: weil jede mögliche Suffix des Strings in der Tabelle ist, LIKE %searchterm% werden identisch-LIKE searchterm%.

Sie benötigen nicht mehr die führende %, damit der normale Index wieder verwendet werden kann.