MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Indeks zakresu dat Mongo z filtrami

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ń w creationDate i reportCount 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 i parent filtry. To przesłuchanie powoduje odrzucenie 37 dokumentów, co skutkuje zwrotem 19 dokumentów.

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.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Migracja danych z Oracle do Mongo DB

  2. PowerShell nie jest kompatybilny z metodami sterownika MongoDB C#?

  3. MongoDB $pullAll

  4. 'TypeError:meme.find(...).forEach nie jest funkcją' w js węzła mangusty?

  5. Jak dodać dane do tablicy w schemacie Mongoose?