Począwszy od MongoDB w wersji 3.0, wystarczy zmienić kolejność z
collection.aggregate(...).explain()
do
collection.explain().aggregate(...)
da pożądane rezultaty (dokumentacja tutaj ).
W przypadku starszych wersji> = 2,6 należy użyć explain
opcji 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żnym czynnikiem przy agregacji ram jest to, że indeks może być użyty tylko do pobierania danych początkowych do rurociągu (np wykorzystania $match
, $sort
, $geonear
na początku przewodu rurowego), jak również późniejsze $lookup
i $graphLookup
etapy. Po pobraniu danych do potoku agregacji w celu ich przetworzenia (np. Przejścia przez etapy, takie jak $project
, $unwind
i $group
) dalsza manipulacja będzie przechowywana w pamięci (prawdopodobnie przy użyciu plików tymczasowych, jeśli allowDiskUse
opcja jest ustawiona).
Optymalizacja rurociągów
Ogólnie rzecz biorąc, możesz zoptymalizować potoki agregacji przez:
- Uruchomienie potoku z
$match
etapem ograniczenia przetwarzania do odpowiednich dokumentów.
- Zapewnienie, że początkowe
$match
/ $sort
etapy są obsługiwane przez skuteczny indeks .
- Filtrowanie danych za pomocą wcześnie
$match
, $limit
i $skip
.
- Minimalizowanie niepotrzebnych etapów i manipulacji dokumentami (być może ponowne rozważenie schematu, jeśli wymagana jest skomplikowana gimnastyka agregująca).
- Skorzystaj z nowszych operatorów agregacji, jeśli zaktualizowałeś serwer MongoDB. Na przykład MongoDB 3.4 dodano wiele nowych etapów agregacji i wyrażeń, w tym obsługę tablic, ciągów znaków i aspektów.
Istnieje również szereg optymalizacji potoku agregacji, które są wykonywane automatycznie w zależności od wersji serwera MongoDB. Na przykład sąsiednie etapy mogą być łączone i / lub zmieniane w kolejności w celu usprawnienia wykonania bez wpływu na wyniki wyjściowe.
Ograniczenia
Podobnie jak w MongoDB 3.4, explain
opcja Aggregation Framework zapewnia informacje o przetwarzaniu potoku, ale nie obsługuje tego samego poziomu szczegółowości, co executionStats
tryb find()
zapytania. Jeśli koncentrujesz się na optymalizacji początkowego wykonywania zapytania, prawdopodobnie korzystne będzie przejrzenie równoważnego find().explain()
zapytania z executionStats
lub allPlansExecution
szczegółowością .
W narzędziu do śledzenia problemów MongoDB dostępnych jest kilka żądań funkcji, które należy obserwować / głosować za bardziej szczegółowymi statystykami wykonania, aby pomóc zoptymalizować / profilować potoki agregacji: