2016-05-22 17 views
5

Abbiamo una tabella di grandi dimensioni con le informazioni sul prodotto. Quasi sempre abbiamo bisogno di trovare nomi di prodotti che contengono parole specifiche, ma sfortunatamente queste query impiegano per sempre.Migliorare le prestazioni di una query SQL LIKE

Esempio: trova tutti i prodotti in cui il nome contiene le parole "acciaio" e "102" (non necessariamente uno accanto all'altro, quindi un prodotto come "Ferro acciaio Ninja 102 x" è una corrispondenza, proprio come "Dragon acciaio 102 b "è).

Attualmente lo stiamo facendo in questo modo:

SELECT columns FROM products WHERE name LIKE '%WORD1%' AND name LIKE '%WORD2%' (il numero di parole come normalmente sono 2-4, ma può in teoria essere 7-8 o più).

C'è un modo più veloce per farlo?

Stiamo solo abbinando le parole, quindi mi chiedo se questo possa aiutare in qualche modo (cioè i prodotti nell'esempio sopra sono partite, ma "Samurai swordsteel 102 v" non è una corrispondenza dato che "acciaio" non sta da solo) .

Il mio unico pensiero è quello di creare un tavolo di aiuto con le parole di productnames e quindi utilizzare quella tabella per ottenere gli ID dei prodotti corrispondenti.

cioè una tabella come: [id, parola, ProductID] in modo da ottenere, ad esempio:

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

chiedo solo se v'è una costruito in modo per fare questo in MySQL, in modo da non avere per implementare le mie cose + mantenere due tabelle.

Grazie!

risposta

1

Sfortunatamente, si dispone di caratteri jolly all'inizio del nome del modello. Quindi, MySQL non può usare un indice standard per questo.

Hai due opzioni. Innanzitutto, se le parole sono davvero parole chiave/attributi, allora dovresti avere un'altra tabella, con una riga per parola.

In caso contrario, è possibile provare un indice di testo completo. Si noti che MySQL ha attributi per la lunghezza minima delle parole e utilizza un elenco di parole di arresto. Dovresti tenerne conto prima di costruire l'indice.

+0

Grazie. Abbiamo già un indice di testo completo, ma ci vogliono ancora 5-10 secondi o più per eseguire o query. – Louisa

+0

@Louisa Usi MATCH invece di LIKE per usare l'indice di testo completo? –

+0

Un buon consiglio, ma MATCH restituisce molte righe quando eseguo SELECT * FROM prodotti WHERE MATCH (NAME) CONTRO ('+ word1 + word2 + word3' ') - Ottengo risultati con tutte le 3 parole in, ma anche i risultati con solo 1 -2 delle parole nel nome. – Louisa

Problemi correlati