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?
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.
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%Verwenden Sie die folgende Anweisung in MySQL oder SQL, es wird ein perfektes Ergebnis zurückgegeben:
%Vor%Das sollte funktionieren.
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%