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

Mongodb Explain for Aggregation Framework

Począwszy od MongoDB w wersji 3.0, wystarczy zmienić kolejność z

collection.aggregate(...).explain()

do

collection.explain().aggregate(...)

da Ci pożądane wyniki (dokumentacja tutaj).

W przypadku starszych wersji>=2.6, będziesz musiał użyć explain opcja dla operacji potoku agregacji

explain:true

db.collection.aggregate([
    { $project : { "Tags._id" : 1 }},
    { $unwind : "$Tags" },
    { $match: {$or: [{"Tags._id":"tag1"},{"Tags._id":"tag2"}]}},
    { $group: { 
        _id : "$_id",
        count: { $sum:1 } 
    }},
    {$sort: {"count":-1}}
  ],
  {
    explain:true
  }
)

Ważną kwestią dotyczącą Framework agregacji jest to, że indeks może być używany tylko do pobierania danych początkowych dla potoku (np. użycie $match , $sort , $geonear na początku potoku) oraz kolejne $lookup i $graphLookup gradacja. Po pobraniu danych do potoku agregacji w celu przetworzenia (np. przejście przez etapy, takie jak $project , $unwind i $group ) dalsza manipulacja będzie odbywać się w pamięci (być może przy użyciu plików tymczasowych, jeśli allowDiskUse opcja jest ustawiona).

Optymalizacja potoków

Ogólnie rzecz biorąc, możesz zoptymalizować potoki agregacji poprzez:

  • Uruchamianie potoku za pomocą $match etap, aby ograniczyć przetwarzanie do odpowiednich dokumentów.
  • Zapewnienie początkowego $match / $sort etapy są obsługiwane przez wydajny indeks.
  • Wczesne filtrowanie danych za pomocą $match , $limit i $skip .
  • Minimalizowanie niepotrzebnych etapów i manipulacji dokumentami (być może ponowne rozważenie schematu, jeśli wymagana jest skomplikowana gimnastyka agregacji).
  • Korzystanie z nowszych operatorów agregacji po uaktualnieniu serwera MongoDB. Na przykład MongoDB 3.4 dodał wiele nowych etapów agregacji i wyrażeń, w tym obsługę pracy z tablicami, łańcuchami i aspektami.

Istnieje również wiele optymalizacji potoku agregacji, które są wykonywane automatycznie w zależności od wersji serwera MongoDB. Na przykład sąsiednie etapy można połączyć i/lub zmienić kolejność, aby poprawić wykonanie bez wpływu na wyniki wyjściowe.

Ograniczenia

Podobnie jak w MongoDB 3.4, agregacja Framework explain opcja dostarcza informacji o tym, jak potok jest przetwarzany, ale nie obsługuje tego samego poziomu szczegółowości, co executionStats tryb dla find() zapytanie. Jeśli koncentrujesz się na optymalizacji początkowego wykonywania zapytań, prawdopodobnie korzystne będzie przejrzenie równoważnego find().explain() zapytanie z executionStats lub allPlansExecution gadatliwość.

Istnieje kilka istotnych próśb dotyczących funkcji do obejrzenia/zagłosowania w narzędziu MongoDB do śledzenia problemów dotyczących bardziej szczegółowych statystyk wykonania, aby pomóc zoptymalizować/profilować potoki agregacji:

  • SERVER-19758:Dodaj tryby wyjaśniania „executionStats” i „allPlansExecution” do wyjaśniania agregacji
  • SERWER-21784:Śledź statystyki wykonania dla każdego etapu potoku agregacji i udostępniaj je za pomocą wyjaśnień
  • SERVER-22622:Ulepsz objaśnienie $lookup, aby wskazać plan zapytania w kolekcji „z”


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Aplikacja Heroku ulega awarii po aktualizacji MongoDB do wersji 3.0

  2. Zaktualizuj i zwróć dokument w Mongodb

  3. Jak używać modyfikatora aktualizacji $push w MongoDB i C# podczas aktualizowania tablicy w dokumencie?

  4. Wyklucz określone pola w indeksie symboli wieloznacznych w MongoDB

  5. Zarządzanie użytkownikami bazy danych za pomocą ClusterControl