2012-04-28 14 views
6

Ho una tabella (MySQL 5.1, InnoDB) con circa 3 milioni di righe, il 98% di esse consiste di una sola parola. Se sto eseguendo una query utilizzando LIKE %searchterm%, è troppo lento.MySQL: (testo completo/indice) Ricerca su "colonne di una parola"

Poiché ci sono solo query SELECT per questa tabella, stavo pensando di convertirlo in MyISAM (come InnoDB non ancora, o solo per la versione 5.6+, supporta FULLTEXT).

Tuttavia, mi chiedevo se questo avrebbe davvero velocizzato la query, dal momento che so che un indice FULLTEXT è una tabella con parole divise ("Hello sunny day" -> "hello", " soleggiato "," giorno "), quindi se ci sono solo parole per colonna, ha senso?

Aumenterebbe le query se inserissi un normale indice su questa colonna di testo?

Grazie in anticipo per il vostro aiuto!

risposta

3

L'utilizzo di un indice FULLTEXT potrebbe essere d'aiuto. Divide il testo in parole, ma poi indicizza anche quelle parole. È questa indicizzazione che accelera la query. Ma è necessario utilizzare lo full-text search functions e non LIKE per sfruttare l'indice.

Un indice normale non ti aiuterà. Una clausola LIKE può sfruttare solo un indice se ha un prefisso costante.

  • yourcolumn LIKE 'searchterm%' utilizzare l'indice.
  • yourcolumn LIKE '%searchterm%' non utilizzare l'indice.
+0

Wow, grazie per la spiegazione e l'esempio! Grazie mille, Mark! – Chris

0

La ricerca di testo completo o l'indice di testo completo presentano degli svantaggi? Personalmente ho perso la ricerca di parte di una parola, come "Array" in "ByteArray".

Si può considerare l'approccio che presento qui:

https://stackoverflow.com/a/22531268/543814

L'idea è quella di memorizzare ogni possibile suffisso di una stringa.

Ciò richiede più spazio di archiviazione, a seconda delle lunghezze delle stringhe.

In cambio, si arriva a usare un indice normale per queste query: perché ogni possibile suffisso della stringa è nella tabella, LIKE %searchterm% diventa identico-LIKE searchterm%.

Non è più necessario il numero iniziale %, quindi è possibile riutilizzare l'indice normale.

Problemi correlati