Die Indexierung in einer Datenbank ist enorm wichtig um performant Abfragen in dieser auszuführen. Bevor man Indizes setzt, sollte man sich jedoch im Klaren sein, dass diese zusätzlichen Festplattenspeicher brauchen und das Erzeugen der Indizes ebenso Zeit in Anspruch nimmt. Von klarem Mehrwert sind jedoch die Auswirkungen, wobei Abfragen nun um ein Vielfaches schneller erfolgen.
Index anlegen
Wir gehen in diesem Beispiel davon aus, dass wir Appln (Anmeldungen), dessen Title (Titel) und zugehörige Personen haben. Angenommen die Dateien beinhalten nun 100 Millionen Zeilen, was keine Seltenheit ist. So ist es überaus notwendig einen Index zu setzen, bevor Daten überhaupt importiert werden. Damit wird gewährleistet, dass ihr bei Suchanfragen nicht 1000-fach länger warten müsst, als notwendig.
Bei einer Indexierung wird eine bestimmte Eigenschaft gesucht, hier in unserem Fall bis auf eine Ausnahme, die ID. Diese wird dann mit einem Algorithmus
besonders effizient geordnet. Somit können spätere Abfragen dann ohne alle Daten durchzugehen binnen Millisekunden die gesuchte ID finden. Dies
erfolgt über sogenannte Suchbäume. Man kann sich dies so vorstellen, dass die linke Wurzel die Anfangsbuchstaben A bis M hat und die rechte N bis Z. So ist zumindest
das Grundprinzip der Suche in einem Baum. Es gibt dabei verschiedene Algorithmen wie im Wikipedia-Artikel zu sehen ist.
Wir erzeugen beispielhaft mit:
- CREATE INDEX ON :Appln(ID);
- CREATE INDEX ON :Title(applnID);
- CREATE INDEX ON :Title(title);
- CREATE INDEX ON :Person(ID);
die einzelnen Indizes. Nun folgende Daten werden demnach sofort an die richtige Stelle einsortiert. Mit einem Index erfolgt der Import von Daten immer etwas langsamer, aber wenn man die späteren Suchanfragen betrachtet, ist dies vernachlässigbar.
Nachträglich Index anlegen
Vergisst man jedoch vor dem Import einmal den Index anzulegen, so kann man dies auch später nachholen. Allerdings dauert dies fast so lang wie der Import selbst. Daher solltet ihr akribisch darauf achten vor dem Import den Index anzulegen.
Ich habe hier einmal beispielhaft 20 Millionen Zeilen von Appln's importiert und vergessen einen Index anzulegen. Wir können im Browser zu jeder Zeit :schema eingeben um den Stand von Indexierungen (Indexes) und Einschränkungen (constraints) anzeigen lassen. Wie wir sehen findet immer noch das sogenannte POPULATING statt, was anzeigt, dass die Nach-Indexierung noch andauert.
Nun könntet ihr auch einfach ungeduldig sein und einfach die Datenbank löschen, neu anlegen, Index setzen und neu importieren. Aber wenn ihr auch abwarten könnt und nicht alle paar Minuten den
Status überprüfen möchtet, so gibt es natürlich auch eine Möglichkeit dafür. Gibt dafür :schema await ein. Nun seht ihr solange die Indexierung braucht ein Executing
query...
Fazit
Hier hab ich euch die Basics der Indexierung unter Neo4j gezeigt. Auf jede Fälle etwas was man bei jeder Datenbank Gebrauch machen und
gewissenhaft einsetzen sollte. Am Ende habe ich gezeigt, dass ein nachträgliches Indexing auch kein Problem darstellt.
Kommentar schreiben