Kilka kluczowych punktów z wyników planu wyjaśniania:
- Zapytanie dotyczy następujących atrybutów:
siteId, status, creationDate, reportCount, assignee, parent
- Zwycięski plan ma dwa etapy:
- IX_SCAN używa
creationDate_1_reportCount_1_label_1
, używa indeksowanych wyszukiwań wcreationDate
ireportCount
zidentyfikować 56 dokumentów, które są następnie przekazywane do etapu FETCH - FETCH otrzymuje 56 dokumentów z etapu IX_SCAN, a następnie przesłuchuje te dokumenty, aby zastosować
siteId
,status
,assignee
iparent
filtry. To przesłuchanie powoduje odrzucenie 37 dokumentów, co skutkuje zwrotem 19 dokumentów.
- IX_SCAN używa
Tak więc indeks obejmuje tylko 2 z 6 atrybutów w zapytaniu, a pozostałe 4 atrybuty w zapytaniu są stosowane na podstawie analizy dokumentów nie indeks . Jeśli chcesz, aby to zapytanie było w pełni objęte indeksem, utwórz następujący indeks:
db.collection.createIndex(
{siteId: 1, status: 1, creationDate: 1, reportCount: 1, assignee: 1, parent: 1}
)
Jeśli uruchomisz ponownie z tym indeksem, powinieneś zauważyć, że (a) MongoDB wybiera ten indeks i (b) liczba dokumentów przekazanych przez etap IX_SCAN jest taka sama, jak liczba dokumentów zwróconych przez wywołanie wyszukiwania.
Mówię „powinien znaleźć” ponieważ są tutaj inne aspekty, które mogą spowodować, że MongoDB wybierze inny indeks, np. użycie $nor
i etap sortowania (creationDate: 1
). Zalecam poprawianie indeksu i uruchamianie z wyjaśnieniem „włączonym” po każdym dostosowaniu i szukanie tych kluczowych elementów w executionStats
dokument podrzędny:
- "nZwrócony"
- „całkowita liczba przebadanych kluczy”
- „całkowita liczba zbadanych dokumentów”
Prosta zasada jest taka:im bliżej totalKeysExamined
jest nReturned
i bliżej totalDocsExamined
wynosi zero ... im lepsze pokrycie indeksu.
Istnieje również kwestia kosztu indeksu (w sensie wpływu na czasy zapisu i przechowywania indeksu), więc sugeruję rozważenie wymagań niefunkcjonalnych - czy pożądane czasy, które upłynął, można osiągnąć bez pełnego pokrycia indeksu? Jeśli nie, powinieneś przystąpić do testowania empirycznego, ale bądź przygotowany na dostosowanie swojego wyboru w odpowiedzi na to, co explain()
wyjście mówi ci.