Mam następujący problem: Mam bazę danych zawierającą ponad 2 miliony rekordów. Każdy rekord ma pole ciągu X i chcę wyświetlić listę rekordów, dla których pole X zawiera określony ciąg. Każdy rekord ma rozmiar około 500 bajtów.
Mówiąc konkretniej: w GUI mojej aplikacji mam pole tekstowe, w którym mogę wpisać ciąg znaków. Nad polem tekstowym mam tabelę wyświetlającą (pierwsze N, np. 100) rekordy pasujące do ciągu w polu tekstowym. Kiedy wpisuję lub usuwam jeden znak w polu tekstowym, zawartość tabeli musi być aktualizowana na bieżąco.
Zastanawiam się, czy istnieje skuteczny sposób na wykonanie tego przy użyciu odpowiednich struktur indeksu i / lub buforowania. Jak wyjaśniono powyżej, chcę wyświetlić tylko pierwsze N elementów, które pasują do zapytania. Dlatego, dla N wystarczająco małych, ładowanie pasujących elementów z bazy danych nie powinno być dużym problemem. Poza tym buforowanie elementów w pamięci głównej może przyspieszyć pobieranie.
Myślę, że głównym problemem jest to, jak szybko znaleźć pasujące elementy, biorąc pod uwagę ciąg wzorca. Czy mogę polegać na niektórych funkcjach DBMS, czy też muszę samodzielnie budować indeks w pamięci? Jakieś pomysły?
EDYTOWAĆ
Przeprowadziłem pierwszy eksperyment. Podzieliłem rekordy na różne pliki tekstowe (maksymalnie 200 rekordów na plik) i umieściłem pliki w różnych katalogach (wykorzystałem zawartość jednego pola danych do określenia drzewa katalogów). Skończyłem z około 50000 plików w około 40000 katalogów. Następnie uruchomiłem Lucene, aby zindeksować pliki. Wyszukiwanie łańcucha za pomocą programu demo Lucene jest dość szybkie. Podział i indeksowanie zajęło kilka minut: jest to dla mnie całkowicie akceptowalne, ponieważ jest to statyczny zestaw danych, o który chcę zapytać.
Następnym krokiem jest zintegrowanie Lucene z programem głównym i użycie trafień zwróconych przez Lucene do załadowania odpowiednich rekordów do pamięci głównej.