MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Quelle est l'importance de l'ordre des index composés dans MongoDB en termes de performances ?

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 par sex première. Inversement si vous avez indexé par name , 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 mettez high-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é.