Tengo el siguiente problema: tengo una base de datos que contiene más de 2 millones de registros. Cada registro tiene un campo de cadena X y quiero mostrar una lista de registros para los cuales el campo X contiene una cadena determinada. Cada registro tiene un tamaño de aproximadamente 500 bytes.
Para hacerlo más concreto: en la GUI de mi aplicación tengo un campo de texto donde puedo ingresar una cadena. Sobre el campo de texto tengo una tabla que muestra los (primeros N, por ejemplo, 100) registros que coinciden con la cadena en el campo de texto. Cuando escribo o elimino un carácter en el campo de texto, el contenido de la tabla debe actualizarse sobre la marcha.
Me pregunto si hay una manera eficiente de hacer esto usando estructuras de índice apropiadas y / o almacenamiento en caché. Como se explicó anteriormente, solo quiero mostrar los primeros N elementos que coinciden con la consulta. Por lo tanto, para N lo suficientemente pequeño, no debería ser un gran problema cargar los elementos coincidentes de la base de datos. Además, el almacenamiento en caché de elementos en la memoria principal puede acelerar la recuperación.
Creo que el problema principal es cómo encontrar los elementos coincidentes rápidamente, dada la cadena de patrón. ¿Puedo confiar en algunas instalaciones de DBMS o tengo que construir un índice en memoria yo mismo? ¿Algunas ideas?
EDITAR
He realizado un primer experimento. He dividido los registros en diferentes archivos de texto (como máximo 200 registros por archivo) y coloqué los archivos en diferentes directorios (utilicé el contenido de un campo de datos para determinar el árbol de directorios). Termino con aproximadamente 50000 archivos en aproximadamente 40000 directorios. Luego ejecuté Lucene para indexar los archivos. Buscar una cadena con el programa de demostración Lucene es bastante rápido. Dividir e indexar tomó unos minutos: esto es totalmente aceptable para mí porque es un conjunto de datos estáticos que quiero consultar.
El siguiente paso es integrar Lucene en el programa principal y usar los hits devueltos por Lucene para cargar los registros relevantes en la memoria principal.