Es gibt zwei relevante Merkmale eines Index, die schnelle Suchen ermöglichen (im Vergleich zum Durchführen eines Sammlungsscans):
- Reihenfolge der Werte
- Kompaktheit der indizierten Werte
Wenn Sie Werte a
haben und b
, können Sie sagen, dass a
kommt vor b
, lexikografisch. Wenn Sie Dokumente {a: 2, b: 5}
haben und {b: 4, a: 3}
, gibt es keine einheitliche Anordnung dieser Dokumente, die typische Anfragen beantworten würde. Zum Beispiel, wenn Sie alle a
wollen Werte geordnet, dann erwarten Sie vielleicht 2, 3
, aber wenn Sie den b
wollen Werte, die Sie erwarten könnten 4, 5
- erfordert, dass die Reihenfolge der Dokumente umgekehrt wird.
Wenn eine Datenbank den Index auf der Festplatte speichert, werden die Werte in Indexreihenfolge gespeichert (was auch immer das für den jeweiligen Index sein mag, z. B. wirkt sich die Sortierung darauf aus). Im Allgemeinen gibt es keine einzelne Ordnung, die für Sammlungsdokumente insgesamt verwendet werden kann, daher sind Sammlungsdokumente ungeordnet.
Wenn Sie nach Index abfragen, nehmen Sie den gesuchten Wert und führen im Wesentlichen eine binäre Suche mit dem Index durch, da die Daten im Index sortiert sind.
Der zweite Grund für die Verwendung des Index besteht darin, dass beim Scannen der Sammlung für jedes Dokument normalerweise das gesamte Dokument von der Festplatte abgerufen und übersprungen werden muss. Wenn Sie eine Sammlung von 100 GB haben und einen Scan durchführen, müssen Sie möglicherweise mehr als 100 GB an Daten überspringen. Wenn dieselbe Sammlung einen 100-MB-Index für ein Feld hat (weil der Index nur die Werte in diesem Feld und nicht die gesamten Daten des Dokuments speichert) und die Datenbank einen vollständigen Index-Scan durchführt, muss sie nur 100 MB davon durchlaufen Daten.
Nun zu Ihrer Frage zum Speichern von fehlenden Werten in einem Index.
Aus der Sicht des Index ist die „Wertlosigkeit“ in verschiedenen Dokumenten derselbe Wert. Sie verlieren die Fähigkeit, eine binäre Suche durchzuführen, wenn alle Ihre Werte identisch sind. Wenn Sie also nach diesem "wertlosen" Dokument suchen, gibt Ihnen der Index alle Dokumente in der Sammlung zurück, denen der Wert fehlt, und Sie müssen sie dann trotzdem durchsuchen, um nach anderen Bedingungen zu filtern haben. Da dies im Allgemeinen zu einer schlechten Selektivität führt, kümmern sich die Datenbanken nicht um Indizes und führen von vornherein Sammlungsscans durch.
Und höchstwahrscheinlich möchten Sie einige andere Felder aus Ihrer Abfrage herausnehmen, nicht das Feld, das keinen Wert hat. Jetzt möchten Sie also, dass der Index vollständige Dokumente speichert, wodurch die Idee der Kompaktheit zunichte gemacht wird.