Zdarzenia kolekcji mają identyfikator użytkownika i tablicę zdarzeń - każdy element w tablicy jest osadzonym dokumentem. Przykład:mongodb - indeks daty nie jest używany
{
"_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",
}
Korzystanie z kwerendy jak poniżej jednego tofind zdarzeń generowanych w ciągu ostatnich 30 dni:
db.events.find({ events : { $elemMatch: { "eventId" : 201,
"eventDate" : {$gt : new Date(1231657163876) } } } } ).explain()
planu kwerend pokazuje, że wskaźnik na "events.eventDate" jest używany, gdy Wyniki badań zawiera mniejszą liczbę zdarzeń (około 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")
]
]
}
}
Jednak, gdy istnieje duża liczba zdarzeń (około 500), indeks nie jest używany:
{
"cursor" : "BasicCursor",
"nscanned" : 4,
"nscannedObjects" : 4,
"n" : 0,
"millis" : 0,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
}
}
Dlaczego indeks nie jest używany, gdy istnieje wiele zdarzeń? Może być, gdy jest duża liczba zdarzeń, MongoDB stwierdza, że jest skuteczny tylko do skanowania wszystkich przedmiotów niż przy użyciu indeksu?
Skarżysz się, że optymalizator nie używa indeksu dla zapytania, które zajęło 0 ms, aby powrócić? :) –
Powyższy wynik wyjaśnienia pochodzi z kolekcji testów. Przy około 20 milionach dokumentów zapytanie trwało około 8 sekund. – dsatish
Takie zapytania zakresu mogą być powolne, jeśli pytasz znaczną część dokumentów kolekcji. Możesz użyć wskazówki, aby wymusić indeks w celu porównania prędkości, ale wyobrażam sobie, że będzie równie powolny podczas skanowania indeksu. Powinieneś zamieścić wyjaśnienie na swoich danych produkcyjnych, z podpowiedziami i bez nich. Chodzi o to, że jeśli znajdziesz kilka milionów dokumentów, które pasują, zajmie to trochę czasu, aby je sprawdzić. –