Optimizar MySQL LIKE consultas '% string%' en innoDB

Tener esta table:

CREATE TABLE `example` ( `id` int(11) unsigned NOT NULL auto_increment, `keywords` varchar(200) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB; 

Nos gustaría optimizar la siguiente consulta:

 SELECT id FROM example WHERE keywords LIKE '%whatever%' 

La tabla es InnoDB, (por lo que no FULLTEXT por el momento), ¿cuál sería el mejor índice para usar con el fin de optimizar dicha consulta?

Hemos intentado un simple:

 ALTER TABLE `example` ADD INDEX `idxSearch` (`keywords`); 

Pero una consulta de explicación muestra que es necesario escanear toda la tabla si nuestras consultas son LIKE 'whatever%' en su lugar, este índice funciona bien, pero de lo contrario no tiene ningún valor.

¿Hay alguna forma de optimizar esto para innoDB?

¡Gracias!

Los índices se crean desde el inicio de la cadena hacia el final. Cuando utilizas la cláusula de tipo LIKE 'whatever%' , MySQL puede usar esos índices basados ​​en el inicio para search rápidamente.

Pero cambiando a LIKE '%whatever%' elimina ese anclaje al comienzo de la cadena. Ahora, los índices basados ​​en el inicio no se pueden usar, porque el término de búsqueda ya no está anclado al comienzo de la cadena; está "flotando" en algún lugar en el medio y todo el campo debe searchse. Cualquier consulta LIKE '%... nunca puede usar índices.

Es por eso que utilizas índices de text completo si todo lo que estás haciendo son búsquedas 'flotantes', porque están diseñadas para ese tipo de uso.

Nota importante: InnoDB ahora admite índices de text completo a partir de la versión 5.6.4. A less que no pueda actualizar al less a 5.6.4, no hay nada que le impida usar InnoDB * AND búsquedas de text completo.

Me gustaría comentar que sorprendentemente, la creación de un índice también ayudó a acelerar las consultas para consultas like '%abc%' en mi caso.

Ejecutando MySQL 5.5.50 en Ubuntu (dejando todo en forma pnetworkingeterminada), he creado una tabla con muchas columnas e insertado 100,000 inputs ficticias. En una columna, inserté cadenas completamente aleatorias con 32 caracteres (es decir, todas son únicas).

Ejecuté algunas consultas y luego agregué un índice en esta columna. Un simple

 select id, searchcolumn from table_x where searchcolumn like '%ABC%' 

devuelve un resultado en ~2 seconds sin el índice y en 0.05 seconds con el índice.

Esto no se ajusta a las explicaciones anteriores (y en muchas otras publicaciones). Cuál podría ser la razón para eso?

EDITAR He verificado la salida EXPLAIN. El resultado dice que las filas son 100,000 , pero la información adicional es " Using where; Using index ". Entonces, de alguna manera, ¿el DBMS tiene que search todas las filas, pero todavía puede utilizar el índice?