2012-04-28 13 views
6

Tengo una tabla (MySQL 5.1, InnoDB) con aproximadamente 3M filas, el 98% de ellas constan de una sola palabra. Si estoy ejecutando una consulta usando LIKE %searchterm%, es demasiado lento.MySQL: (Texto completo/índice) Buscar en "columnas de una sola palabra"

Como hay SELECT consultas solo para esta tabla, estaba pensando en convertirla a MyISAM (como InnoDB todavía no, o solo para la versión 5.6+, compatible con FULLTEXT).

Sin embargo, me preguntaba si esto realmente aceleraría la consulta, ya que, por lo que sé, FULLTEXT-index es una tabla con palabras divididas ("Hola día soleado" -> "hola", " soleado "," día "), así que si solo hay una palabra por columna, ¿tendría algún sentido?

¿Aceleraría las consultas si quisiera poner un índice normal en esta columna de texto?

Gracias de antemano por su ayuda!

Respuesta

3

Usar un índice FULLTEXT ayudaría. Divide el texto en palabras, pero luego también indexa esas palabras. Es esta indexación lo que acelera la consulta. Pero debe utilizar full-text search functions, y no ME GUSTA, para aprovechar el índice.

Un índice normal no lo ayudará. Una cláusula LIKE solo puede aprovechar un índice si tiene un prefijo constante.

  • yourcolumn LIKE 'searchterm%' usaría el índice.
  • yourcolumn LIKE '%searchterm%' no usaría el índice.
+0

¡Guau, gracias por la explicación y el ejemplo! Muchas gracias, Mark! – Chris

0

¿Tiene alguna desventaja la búsqueda de texto completo o el índice de texto completo? Personalmente me perdí de buscar parte de una palabra, como 'Matriz' en 'ByteArray'.

Puede considerar el enfoque que presento aquí:

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

La idea es almacenar todas las posibles sufijo de una cadena.

Esto requiere más espacio de almacenamiento, dependiendo de la longitud de la cuerda.

A cambio, se llega a utilizar un índice normal para estas consultas: porque cada posible sufijo de la cadena está en la mesa, se convierte en LIKE %searchterm% idéntica a LIKE searchterm%.

Ya no necesita el %, por lo que el índice normal se puede volver a utilizar.

Cuestiones relacionadas