Il existe deux fonctionnalités pertinentes d'un index qui permettent des recherches rapides (par rapport à l'exécution d'une analyse de collection) :
- Ordre des valeurs
- Compacité des valeurs indexées
Si vous avez des valeurs a
et b
, vous pouvez dire que a
vient avant b
, lexicographiquement. Si vous avez des documents {a: 2, b: 5}
et {b: 4, a: 3}
, il n'y a pas de classement unique de ces documents qui satisferait les requêtes typiques. Par exemple, si vous voulez que tous les a
valeurs ordonnées alors vous pourriez vous attendre à 2, 3
, mais si vous voulez le b
valeurs auxquelles vous pourriez vous attendre 4, 5
- nécessitant l'inversion de l'ordre des documents.
Lorsqu'une base de données stocke l'index sur le disque, les valeurs sont stockées dans ordre d'index (quel que soit ce qui pourrait être pour l'index particulier, par exemple, le classement affecte cela). Généralement, il n'y a pas de classement unique utilisable pour l'ensemble des documents de collection, par conséquent, les documents de collection ne sont pas classés.
Lorsque vous effectuez une requête par index, vous prenez la valeur recherchée et exécutez essentiellement une recherche binaire à l'aide de l'index, car les données de l'index sont triées.
La deuxième raison d'utiliser l'index est que, si vous numérisez la collection, pour chaque document, le document entier doit généralement être récupéré à partir du disque et ignoré. Si vous avez une collection de 100 Go et que vous effectuez une analyse, vous devrez peut-être ignorer 100 Go de données. Si la même collection a un index de 100 Mo sur un champ (parce que l'index ne stocke que les valeurs de ce champ et non la valeur de données du document entier), et que la base de données effectue une analyse complète de l'index, elle n'a qu'à parcourir 100 Mo de données.
Maintenant, à votre question sur le stockage du manque de valeurs dans un index.
Du point de vue de l'index, le "manque de valeur" dans différents documents est la même valeur. Vous perdez la possibilité d'effectuer une recherche binaire lorsque toutes vos valeurs sont identiques. Donc, si vous recherchez ce document "sans valeur", l'index vous rendra tous les documents de la collection qui n'ont pas de valeur, puis vous devrez quand même les parcourir pour filtrer selon les autres conditions que vous ont. Étant donné que cela produit généralement une mauvaise sélectivité, les bases de données ne se soucient pas des index et effectuent des analyses de collection en premier lieu.
Et, très probablement, vous voulez que d'autres champs soient exclus de votre requête, pas le champ qui n'a pas de valeur. Alors maintenant, vous voulez que l'index stocke des documents complets, ce qui va à l'encontre de l'idée de compacité.