Tengo un diccionario de inglés en una base de datos MySQL con poco más de 250K entradas, y estoy usando un front-end simple de ruby para buscarlo con comodines al comienzo de la instrumentos de cuerda. Hasta ahora he estado haciendo de esta manera:Método rápido (er) para búsqueda de comodines de 250K + cadenas
SELECT * FROM words WHERE word LIKE '_e__o'
o incluso
SELECT * FROM words WHERE word LIKE '____s'
Siempre sé la longitud exacta de la palabra, pero todos excepto un único carácter potencialmente desconocida.
Esto es más lento que melaza, unas quince veces más lento que una consulta similar sin el comodín principal porque el índice de la columna no se puede utilizar.
He intentado algunos métodos para limitar el alcance de la búsqueda. Por ejemplo, agregué 26 columnas adicionales que contienen los recuentos de letras individuales de cada palabra y estrecho la búsqueda usando los primeros. También he intentado reducir el tamaño de la palabra. Estos métodos casi no hicieron diferencia, gracias a la ineficacia inherente de las búsquedas de comodines. He experimentado con la declaración REGEXP, que es incluso más lenta.
SQLite y PostgreSQL son tan limitados como MySQL, y aunque tengo una experiencia limitada con los sistemas NoSQL, mi investigación me da la impresión de que sobresalen en la escalabilidad, no en el rendimiento del tipo que necesito.
Mi pregunta es, entonces, ¿dónde debo buscar una solución? ¿Debo continuar tratando de encontrar una forma de optimizar mis consultas o agregar columnas suplementarias que puedan reducir mi posible conjunto de registros? ¿Hay sistemas diseñados específicamente para lograr una búsqueda rápida de comodines en esta línea?
Probablemente desee explorar las opciones de FTS (búsqueda de texto completo). SQLite FTS4 funciona bien en mi experiencia, no sé de otros. – ergosys
¿Son todas sus consultas (lentas) de este tipo? 'palabra LIKE '__e_b__on''? –
@ergosys - por lo que entiendo, MySQL fts no puede realizar búsquedas de comodines en palabras sueltas. – Daniel