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ń wcreationDateireportCountzidentyfikować 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,assigneeiparentfiltry. 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.