Ich habe das folgende Problem: Ich habe eine Datenbank mit mehr als 2 Millionen Datensätzen. Jeder Datensatz hat ein Zeichenkettenfeld X und ich möchte eine Liste von Datensätzen anzeigen, für die Feld X eine bestimmte Zeichenkette enthält. Jeder Datensatz ist ungefähr 500 Byte groß.
Um es konkreter zu machen: In der Benutzeroberfläche meiner Anwendung habe ich ein Textfeld, in das ich eine Zeichenfolge eingeben kann. Über dem Textfeld befindet sich eine Tabelle mit den (ersten N, z. B. 100) Datensätzen, die mit der Zeichenfolge im Textfeld übereinstimmen. Wenn ich ein Zeichen in das Textfeld eingebe oder lösche, muss der Tabelleninhalt sofort aktualisiert werden.
Ich frage mich, ob es einen effizienten Weg gibt, dies mit geeigneten Indexstrukturen und / oder Caching zu tun. Wie oben erläutert, möchte ich nur die ersten N Elemente anzeigen, die der Abfrage entsprechen. Daher sollte es für N, das klein genug ist, kein großes Problem sein, die übereinstimmenden Elemente aus der Datenbank zu laden. Außerdem kann das Zwischenspeichern von Elementen im Hauptspeicher das Abrufen beschleunigen.
Ich denke, das Hauptproblem ist, wie man die zusammenpassenden Einzelteile schnell findet, gegeben der Musterzeichenkette. Kann ich mich auf einige DBMS-Funktionen verlassen oder muss ich selbst einen speicherinternen Index erstellen? Irgendwelche Ideen?
BEARBEITEN
Ich habe ein erstes Experiment durchgeführt. Ich habe die Datensätze in verschiedene Textdateien aufgeteilt (höchstens 200 Datensätze pro Datei) und die Dateien in verschiedene Verzeichnisse gestellt (ich habe den Inhalt eines Datenfelds verwendet, um den Verzeichnisbaum zu bestimmen). Am Ende habe ich ungefähr 50000 Dateien in ungefähr 40000 Verzeichnissen. Ich habe dann Lucene ausgeführt, um die Dateien zu indizieren. Die Suche nach einer Zeichenfolge mit dem Lucene-Demoprogramm ist ziemlich schnell. Das Aufteilen und Indizieren dauerte einige Minuten. Dies ist für mich völlig akzeptabel, da es sich um einen statischen Datensatz handelt, den ich abfragen möchte.
Der nächste Schritt besteht darin, Lucene in das Hauptprogramm zu integrieren und die von Lucene zurückgegebenen Treffer zu verwenden, um die relevanten Datensätze in den Hauptspeicher zu laden.