Wie suche ich nach einem Text? (MySQL)

8

Ich habe diese Tabelle:

%Vor%

Ich möchte bussId 5000 zurückgeben, wenn der Benutzer nach (keyword1 oder keyword2 oder name2 oder name1) sucht. Also sollte ich diese Abfrage SELECT * FROM business WHERE nameEn LIKE '%searched_word%' verwenden. Diese Abfrage verwendet jedoch nicht index nameEn or keywords gemäß Vergleich von B- Baum- und Hash-Indizes "Der Index kann auch für LIKE-Vergleiche verwendet werden, wenn das Argument für LIKE eine konstante Zeichenfolge ist, die nicht mit einem Platzhalterzeichen beginnt".

Ich habe diese Lösung, ich möchte eine andere Tabelle erstellen und alle einzelnen Wörter einfügen:

%Vor%

Dann suche ich mit dieser Abfrage nach der bussId:
SELECT * WHERE word LIKE 'searched_word%'.

Auf diese Weise werde ich sicher sein, dass MySQL den Index verwenden wird, und es wird schneller sein, aber diese Tabelle wird ungefähr 20 Millionen Zeilen enthalten!

Gibt es eine andere Lösung?

    
david 17.04.2015, 09:33
quelle

5 Antworten

6

Sie müssen einen Volltextindex verwenden, der MyISAM oder InnoDB ab MySQL 5.6 verwendet:

%Vor%

Und hier ist Ihre Anfrage:

%Vor%     
Adam 20.07.2015 19:08
quelle
0

Haben Sie die Funktionen Instr () oder Locate () probiert? Hier ist eine SO-Diskussion , die sie mit Like vergleicht, aber vielleicht besser ist, eine Front zu vergleichen % Platzhalter Dennoch führt es vollständige Tabellen-Scans durch, merkt aber nicht, wie der MySQL-Abfrageoptimierer mit String-Funktionen indiziert.

%Vor%

ODER

%Vor%

Es kann auch andere Bereiche der Optimierung geben. Prüfen Sie, ob andere potenzielle Indizes in der Tabelle business verfügbar sind, deklarieren Sie explizit bestimmte Spalten anstelle des Sternchens (*), wenn nicht alle Spalten verwendet werden, und analysieren Sie die Spalten nameEN und keywords durch die Leerzeichen einen Wert (mit Transponierungspotenzial), dann den impliziten Join WHERE oder den expliziten Join JOIN verwenden. Dies könnte sogar ein Problem bei der Tabellengestaltung mit der Herausforderung sein, mehrere Werte in einem einzelnen Feld zu speichern.

    
Parfait 22.07.2015 00:58
quelle
0

Mit der neuen Version von MySQL müssen Sie nicht die Engine "MyISAM" erstellen, InnoDB unterstützt auch den FULLTEXT-Index (Ich habe dieses 5.6.15 getestet, unterstützt die Formularversion & gt; = 5.6.4). Also, wenn Ihre Server-Version höher als 5.6.4 als Sie brauchen nur FULLTEXT Index zu Ihrer Tabelle hinzufügen und mit MATCH (...) AGAINST (...), Beispiel unten auswählen

%Vor%     
Gevorg M 22.07.2015 12:35
quelle
0

Verwenden Sie die folgende Anweisung in MySQL oder SQL, es wird ein perfektes Ergebnis zurückgegeben:

%Vor%

Das sollte funktionieren.

    
Ritobroto Mukherjee 23.07.2015 08:12
quelle
0

20 Millionen Datensätze sind ziemlich viel und eine Mapping-Tabelle mit varchar Spalte würde die maximal zulässigen Zeichen in Byte für jede Zeile + 32-Bit für Integer-Spalte zuweisen.

Was wäre, wenn Sie einfach eine Tabelle wie (id int, crc int) erstellen und nur den crc32-Wert der Textdaten speichern könnten? Es ist Groß- und Kleinschreibung zu beachten, also müssen Sie in Groß- / Kleinschreibung konvertieren, während Sie die Daten und die gleichen Daten beim Vergleich auffüllen.

Ich stimme dem Volltextansatz zu, aber um Platz zu sparen und den Vorteil der Indexierung zu nutzen, können Sie Folgendes versuchen:

%Vor%     
Engin 27.07.2015 17:00
quelle

Tags und Links