Il problema con la ricerca di tipo '%keyword%' è che non c'è modo di cercare in modo efficiente su di essa in una tabella normale, anche se si crea un indice su quella colonna. Pensa a come saresti quella stringa in su nell'elenco telefonico. In realtà non c'è modo di ottimizzarlo - devi scansionare l'intera rubrica telefonica - ed è quello che fa MySQL, una scansione completa della tabella.
Se modifichi la ricerca in "parola chiave%" e utilizzi un indice, puoi ottenere una ricerca molto veloce. Tuttavia, sembra che questo non sia quello che vuoi.
Quindi, con questo in mente, ho usato un po' l'indicizzazione/ricerca fulltext, e qui ci sono alcuni pro e contro:
Pro
- Molto veloce
- Restituisce i risultati ordinati per pertinenza (per impostazione predefinita, anche se puoi utilizzare qualsiasi ordinamento)
- È possibile utilizzare le parole d'arresto.
Contro
- Funziona solo con le tabelle MyISAM
- Le parole troppo corte vengono ignorate (il minimo predefinito è 4 lettere)
- Richiede una clausola SQL diversa in where, quindi dovrai modificare le query esistenti.
- Non corrisponde a stringhe parziali (ad esempio, 'parola' non corrisponde a 'parola chiave', solo 'parola')
Ecco una buona documentazione sulla ricerca full-text .
Un'altra opzione è utilizzare un sistema di ricerca come Sphinx . Può essere estremamente veloce e flessibile. È ottimizzato per la ricerca e si integra bene con MySQL.