Je cherche un conseil sur la stratégie d'indexation à utiliser dans MongoDb 3.4.
Supposons que nous ayons une collection de documents people avec la forme suivante:
{
_id: 10,
name: "Bob",
age: 32,
profession: "Hacker"
}
Imaginons qu'une API Web pour interroger la collection soit exposée et que les seuls filtres possibles soient par nom ou par âge .
Un exemple d'appel à l'API sera quelque chose comme: http://myAwesomeWebSite/people?name="Bob"&age=25
Un tel appel sera traduit dans la requête suivante: db.people.find({name: "Bob", age: 25})
.
Pour mieux clarifier notre scénario, considérons que:
Cela dit, nous devons décider lequel des index suivants offre les meilleures performances:
{name: 1, age: 1}
{name: 1}
Et {age: 1}
Selon certains tests simples, il semble que l'indice composé unique est beaucoup plus performant que les deux indices à champ unique.
En exécutant une seule requête via le mongo Shell, la méthode expl () suggère qu'en utilisant un seul index composé, vous pouvez interroger la base de données presque dix fois plus rapidement qu'en utilisant deux index de champs uniques.
Cette différence semble moins dramatique dans un scénario plus réaliste, où au lieu d'exécuter une seule requête via le mongo Shell, plusieurs appels sont effectués vers deux URL différentes d'une application Web nodejs. Les deux URL exécutent une requête dans la base de données et renvoient les données récupérées sous forme de tableau json, l'une utilisant une collection avec l'index composé unique et l'autre utilisant une collection avec deux index à champ unique (les deux collections ayant exactement les mêmes documents).
Dans ce test, l'indice composé unique semble toujours être le meilleur choix en termes de performances, mais cette fois la différence est moins marquée.
Selon les résultats des tests, nous envisageons d'utiliser l'approche à indice composé unique.
Quelqu'un a-t-il de l'expérience sur ce sujet? Sommes-nous en train de manquer une considération importante (peut-être un inconvénient des grands indices composés)?
Étant donné une requête standard simple (sans limit()
ou sort()
ou quoi que ce soit de fantaisiste appliqué) qui a une condition de filtre sur deux champs (comme dans name
et age
dans votre exemple), afin de trouver les documents résultants, MongoDB:
age
dans un ensemble de données de millions de personnes entre 30 et 40 ans -> chaque recherche serait toujours produire un nombre infini de documents).name
et non age
étant donné que beaucoup de gens auront le même age
(si faible sélectivité) par rapport à name
(sélectivité plus élevée). Mais ce choix dépend également de votre scénario concret et des requêtes que vous comptez exécuter sur votre base de données. Il existe un très bon article sur le Web sur la meilleure façon de définir un indice composé en tenant compte de divers aspects de votre situation spécifique: https://emptysqua.re/blog/optimizing-mongodb-compound-indexes =Les autres aspects à considérer sont les suivants: Les mises à jour de l'indice ont un certain prix. Cependant, si tout ce qui vous intéresse est la vitesse de lecture brute et que vous n'avez que quelques mises à jour de temps en temps, alors vous devriez opter pour des index plus/plus grands.
Et le dernier mais non le moindre (!) Le conseil de base bien utilisé: profilez l'enfer de votre système en utilisant des données réelles et peut-être même des scénarios de charge réalistes. Et continuez également à mesurer au fur et à mesure que vos données/système évoluent.
Lectures supplémentaires: https://docs.mongodb.com/manual/core/query-optimization/index.html
Index intersection vs index composé?
mongodb compund index vs. index intersect
Comment l'ordre des index composés importe-t-il dans MongoDB en termes de performances?