У меня следующая проблема: у меня есть база данных, содержащая более 2 миллионов записей. Каждая запись имеет строковое поле X, и я хочу отобразить список записей, для которых поле X содержит определенную строку. Каждая запись имеет размер около 500 байт.
Чтобы сделать это более конкретным: в графическом интерфейсе моего приложения у меня есть текстовое поле, где я могу ввести строку. Над текстовым полем у меня есть таблица, отображающая (первые N, например, 100) записей, которые соответствуют строке в текстовом поле. Когда я набираю или удаляю один символ в текстовом поле, содержимое таблицы должно обновляться на лету.
Интересно, есть ли эффективный способ сделать это, используя соответствующие структуры индекса и / или кэширование. Как объяснено выше, я хочу отображать только первые N элементов, которые соответствуют запросу. Следовательно, для достаточно малого N это не должно быть большой проблемой при загрузке соответствующих элементов из базы данных. Кроме того, кэширование элементов в основной памяти может ускорить поиск.
Я думаю, что основная проблема заключается в том, как быстро найти подходящие элементы, учитывая строку шаблона. Могу ли я полагаться на некоторые средства СУБД или мне нужно самостоятельно составить некоторый индекс в памяти? Любые идеи?
РЕДАКТИРОВАТЬ
Я провел первый эксперимент. Я разделил записи на разные текстовые файлы (не более 200 записей на файл) и поместил файлы в разные каталоги (я использовал содержимое одного поля данных для определения дерева каталогов). Я получаю около 50000 файлов в 40000 каталогах. Затем я запустил Lucene для индексации файлов. Поиск строки с помощью демонстрационной программы Lucene довольно быстрый. Разделение и индексация заняли несколько минут: для меня это полностью приемлемо, потому что это статический набор данных, который я хочу запросить.
Следующим шагом является интеграция Lucene в основную программу и использование обращений, возвращаемых Lucene, для загрузки соответствующих записей в основную память.