2016-05-22 3 views
5

Wir haben eine große Tabelle mit Produktinformationen. Fast immer müssen wir Produktnamen finden, die bestimmte Wörter enthalten, aber leider dauern diese Abfragen ewig.Verbessern einer SQL LIKE-Abfrage-Leistung

Beispiel: Finden Sie alle Produkte, in denen der Name die Wörter "Stahl" und "102" enthält (nicht notwendigerweise nebeneinander, so ein Produkt wie "Ninja Stahl Eisen 102 x" ist eine Übereinstimmung, genau wie "Dragon Stahl 102 b "ist es).

Zur Zeit machen wir es so:

SELECT columns FROM products WHERE name LIKE '%WORD1%' AND name LIKE '%WORD2%' (die Anzahl der Wörter wie normalerweise 2-4 sind, aber es kann 7-8 oder mehr in der Theorie).

Gibt es eine schnellere Möglichkeit, dies zu tun?

Wir sind nur passende Wörter, also frage ich mich, ob das irgendwie helfen kann (dh die Produkte im obigen Beispiel sind Übereinstimmungen, aber "Samurai swordsteel 102 v" ist keine Übereinstimmung, da "Stahl" nicht alleine steht) .

Mein eigener Gedanke ist, eine Hilfstabelle mit den Wörtern aus Produktnamen in und dann verwenden Sie diese Tabelle, um die IDs der passenden Produkte zu erhalten.

dh eine Tabelle wie: [id, ein Wort, productid], so erhalten wir zum Beispiel:

1, samurai, 3 
2, swordsteel, 3 
3, 102, 3 
4, v, 3 

Frage mich nur, wenn es eine in Art und Weise aufgebaut ist dies in MySQL zu tun, also habe ich nicht um meine eigenen Sachen zu implementieren + zwei Tabellen zu verwalten.

Danke!

Antwort

1

Leider haben Sie am Anfang des Musternamens Platzhalter. Daher kann MySQL dafür keinen Standardindex verwenden.

Sie haben zwei Möglichkeiten. Erstens, wenn die Wörter wirklich Schlüsselwörter/Attribute sind, dann sollten Sie eine andere Tabelle mit einer Zeile pro Wort haben.

Wenn das nicht der Fall ist, können Sie einen Volltextindex versuchen. Beachten Sie, dass MySQL Attribute für die minimale Wortlänge hat und eine Stoppwortliste verwendet. Sie sollten diese berücksichtigen, bevor Sie den Index erstellen.

+0

Danke. Wir haben bereits einen Volltextindex, aber es dauert immer noch 5-10 Sekunden oder länger, um zu laufen oder Fragen zu stellen. – Louisa

+0

@Louisa Verwenden Sie MATCH anstelle von LIKE, um den Volltextindex zu verwenden? –

+0

Gute Tipp, aber MATCH kehrt zu vielen Zeilen zurück, wenn ich SELECT * FROM Produkte WHERE MATCH (NAME) GEGEN ('+ Wort1 + Wort2 + Wort3' ') - Ich bekomme Ergebnisse mit allen 3 Wörtern in, sondern auch Ergebnisse mit nur 1 -2 der Wörter im Namen. – Louisa