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”