Redsandro,
Vous devez tenir compte de la Index Cardinality
et Selectivity
.
1. Cardinalité de l'index
La cardinalité de l'index fait référence au nombre de valeurs possibles pour un champ. Le champ sex
n'a que deux valeurs possibles. Il a une très faible cardinalité . Autres champs tels que names, usernames, phone numbers, emails
, etc. aura une valeur plus unique pour chaque document de la collection, qui est considérée comme à cardinalité élevée .
-
Plus grande cardinalité
Plus la cardinalité d'un champ est grande, plus un index sera utile, car les index réduisent l'espace de recherche, ce qui en fait un ensemble beaucoup plus petit.
Si vous avez un index sur
sex
et vous cherchez des hommes nommés John. Vous ne réduiriez l'espace de résultats que d'environ % 50 si vous indexiez parsex
première. Inversement si vous avez indexé parname
, vous réduiriez immédiatement l'ensemble de résultats à une fraction infime d'utilisateurs nommés John, puis vous feriez référence à ces documents pour vérifier le sexe. -
Règle empirique
Essayez de créer des index sur
high-cardinality
clés ou mettezhigh-cardinality
clés en premier dans l'index composé. Vous pouvez en savoir plus à ce sujet dans la section sur les index composés du livre :MongoDB Le guide définitif
2. Sélectivité
De plus, vous souhaitez utiliser les index de manière sélective et écrire des requêtes qui limitent le nombre de documents possibles avec le champ indexé. Pour rester simple, considérez la collection suivante. Si votre index est {name:1}
, Si vous exécutez la requête { name: "John", sex: "male"}
. Vous devrez scanner 1
document. Parce que vous avez autorisé MongoDB à être sélectif.
{_id:ObjectId(),name:"John",sex:"male"}
{_id:ObjectId(),name:"Rich",sex:"male"}
{_id:ObjectId(),name:"Mose",sex:"male"}
{_id:ObjectId(),name:"Sami",sex:"male"}
{_id:ObjectId(),name:"Cari",sex:"female"}
{_id:ObjectId(),name:"Mary",sex:"female"}
Considérez la collection suivante. Si votre index est {sex:1}
, Si vous exécutez la requête {sex: "male", name: "John"}
. Vous devrez scanner 4
documents.
{_id:ObjectId(),name:"John",sex:"male"}
{_id:ObjectId(),name:"Rich",sex:"male"}
{_id:ObjectId(),name:"Mose",sex:"male"}
{_id:ObjectId(),name:"Sami",sex:"male"}
{_id:ObjectId(),name:"Cari",sex:"female"}
{_id:ObjectId(),name:"Mary",sex:"female"}
Imaginez les différences possibles sur un ensemble de données plus important.
Une petite explication des index composés
Il est facile de faire la mauvaise hypothèse sur les index composés. Selon la documentation de MongoDB sur les index composés.
MongoDB prend en charge les index composés, où une seule structure d'index contient des références à plusieurs champs dans les documents d'une collection. Le schéma suivant illustre un exemple d'index composé sur deux champs :
Lorsque vous créez un index composé, 1 Index contiendra plusieurs champs. Donc si on indexe une collection par {"sex" : 1, "name" : 1}
, l'index ressemblera à peu près à :
["male","Rick"] -> 0x0c965148
["male","John"] -> 0x0c965149
["male","Sean"] -> 0x0cdf7859
["male","Bro"] ->> 0x0cdf7859
...
["female","Kate"] -> 0x0c965134
["female","Katy"] -> 0x0c965126
["female","Naji"] -> 0x0c965183
["female","Joan"] -> 0x0c965191
["female","Sara"] -> 0x0c965103
Si on indexe une collection par {"name" : 1, "sex" : 1}
, l'index ressemblera à peu près à :
["John","male"] -> 0x0c965148
["John","female"] -> 0x0c965149
["John","male"] -> 0x0cdf7859
["Rick","male"] -> 0x0cdf7859
...
["Kate","female"] -> 0x0c965134
["Katy","female"] -> 0x0c965126
["Naji","female"] -> 0x0c965183
["Joan","female"] -> 0x0c965191
["Sara","female"] -> 0x0c965103
Avoir {name:1}
car le préfixe vous servira beaucoup mieux dans l'utilisation des index composés. Il y a beaucoup plus à lire sur le sujet, j'espère que cela pourra apporter une certaine clarté.