Les événements de collection ont userId et un tableau d'événements - chaque élément du tableau est un document incorporé. Exemple:mongodb - index on date n'est pas utilisé
{
"_id" : ObjectId("4f8f48cf5f0d23945a4068ca"),
"events" : [
{
"eventType" : "profile-updated",
"eventId" : "247266",
"eventDate" : ISODate("1938-04-27T23:05:51.451Z"),
},
{
"eventType" : "login",
"eventId" : "64531",
"eventDate" : ISODate("1948-05-15T23:11:37.413Z"),
}
],
"userId" : "junit-19568842",
}
En utilisant une requête comme celle ci-dessous tofind événements générés par les 30 derniers jours:
db.events.find({ events : { $elemMatch: { "eventId" : 201,
"eventDate" : {$gt : new Date(1231657163876) } } } } ).explain()
Le plan de requête indique que l'index sur "events.eventDate" est utilisé lorsque les données de test contient moins d'événements (environ 20):
{
"cursor" : "BtreeCursor events.eventDate_1",
"nscanned" : 0,
"nscannedObjects" : 0,
"n" : 0,
"millis" : 0,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : true,
"indexOnly" : false,
"indexBounds" : {
"events.eventDate" : [
[
ISODate("2009-01-11T06:59:23.876Z"),
ISODate("292278995-01--2147483647T07:12:56.808Z")
]
]
}
}
Cependant, quand il y a un grand nombre d'événements (environ 500), l'indice n'est pas utilisé:
{
"cursor" : "BasicCursor",
"nscanned" : 4,
"nscannedObjects" : 4,
"n" : 0,
"millis" : 0,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
}
}
Pourquoi l'index ne sont pas utilisés quand il y a beaucoup d'événements? Peut être quand il ya un grand nombre d'événements, MongoDB trouve qu'il est efficace juste pour analyser tous les éléments que d'utiliser l'index?
Vous vous plaignez que l'optimiseur n'utilise pas l'index sur une requête qui a pris 0ms pour retourner? :) –
La sortie d'explication ci-dessus provient d'une collection de tests. Avec environ 20M documents, la requête a pris environ 8 secondes. – dsatish
Les requêtes de plage de ce type peuvent être lentes si vous interrogez une partie importante des documents de la collection. Vous pouvez utiliser l'indice pour forcer l'index à comparer la vitesse, mais j'imagine que ce sera aussi lent de faire l'index. Vous devriez poster une explication à partir de vos données de production, avec ou sans indice. Le problème, c'est que si vous trouvez plusieurs millions de documents identiques, cela prendra du temps pour les inspecter. –