2016-05-22 43 views
5

Mamy dużą tabelę z informacjami o produkcie. Prawie przez cały czas szukamy nazw produktów, które zawierają konkretne słowa, ale niestety te zapytania trwają wiecznie.Poprawianie wydajności zapytań SQL LIKE

Przykład: Znajdź wszystkie produkty, w których nazwa zawiera słowa "stal" i "102" (niekoniecznie obok siebie, więc produkt taki jak "Stal żelazna Ninja 102 x" jest zgodny, podobnie jak "Smok stal 102 b "jest to).

Obecnie robimy to tak:

SELECT columns FROM products WHERE name LIKE '%WORD1%' AND name LIKE '%WORD2%' (liczba takich słów są zazwyczaj 2-4, ale może teoretycznie być 7-8 lub więcej).

Czy jest to szybszy sposób?

Dopasowujemy tylko słowa, więc zastanawiam się, czy to może w jakiś sposób pomóc (np. Produkty w powyższym przykładzie są zgodne, ale "Samuraj swordsteel 102 v" nie pasuje, ponieważ "stal" nie jest samodzielna) .

Moja własna myśl polega na stworzeniu tabeli pomocniczej ze słowami z nazw produktów, a następnie użycia tej tabeli do uzyskania identyfikatorów pasujących produktów.

czyli stół jak: [id, słowo, productid] więc mamy na przykład:

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

prostu zastanawiam się, czy jest zbudowany w sposób to zrobić w MySQL, więc nie mam wdrażać własne rzeczy + utrzymywać dwie tabele.

Dzięki!

Odpowiedz

1

Niestety, masz dzikie karty na początku nazwy wzorca. Dlatego MySQL nie może użyć standardowego indeksu do tego.

Masz dwie opcje. Po pierwsze, jeśli słowa są naprawdę słowami kluczowymi/atrybutami, powinieneś mieć inną tabelę, z jednym wierszem na słowo.

Jeśli tak nie jest, możesz wypróbować indeks pełnotekstowy. Zauważ, że MySQL ma atrybuty dla minimalnej długości słowa i używa listy słów kończących. Powinieneś wziąć je pod uwagę przed zbudowaniem indeksu.

+0

Dzięki. Mamy już pełny indeks tekstowy, ale uruchomienie lub zapytanie trwa 5-10 sekund lub dłużej. – Louisa

+0

@Louisa Czy używasz MATCH zamiast LIKE do korzystania z indeksu pełnotekstowego? –

+0

Dobra wskazówka, ale MECZ powraca do wielu wierszy, gdy WYBIERAMĘ * Z produktów GDZIE MECZ (NAZWA) PRZECIWKO ('+ słowo1 + słowo2 + słowo3' ') - otrzymuję wyniki ze wszystkimi trzema słowami, ale także z wynikiem 1 -2 słów w nazwie. – Louisa