Починаючи з версії 3.0 MongoDB, просто змінюючи замовлення з
collection.aggregate(...).explain()
до
collection.explain().aggregate(...)
дасть бажані результати (документація тут ).
Для старих версій> = 2.6 вам потрібно буде скористатися explain
опцією для операцій з конвеєрним трубопроводом
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
}
)
Важливі з Aggregation Framework є те , що індекс може бути використаний тільки для вилучення вихідних даних для трубопроводу (наприклад , використання $match
, $sort
, $geonear
на початку трубопроводу), а також подальший $lookup
і $graphLookup
етапах. Після того, як дані будуть отримані в конвеєр агрегації для обробки (наприклад, проходження етапів, таких як $project
, $unwind
і $group
), подальша маніпуляція буде в пам'яті (можливо, використовуючи тимчасові файли, якщо встановлено allowDiskUse
параметр).
Оптимізація трубопроводів
Загалом, ви можете оптимізувати конвеєрні трубопроводи шляхом:
- Початок трубопроводу зі
$match
стадією, щоб обмежити обробку відповідними документами.
- Забезпечення початкових
$match
/ $sort
етапів підтримується ефективним індексом .
- Фільтрація даних в початку використання
$match
, $limit
і $skip
.
- Мінімізація непотрібних етапів та маніпулювання документами (можливо, перегляд вашої схеми, якщо потрібна складна гімнастика з накопичення).
- Скориставшись новими операторами агрегації, якщо ви оновили свій сервер MongoDB. Наприклад, MongoDB 3.4 додав багато нових етапів агрегування та виразів, включаючи підтримку роботи з масивами, рядками та гранями.
Існує також ряд оптимізацій конвеєрного конвеєра, які автоматично відбуваються залежно від версії сервера MongoDB. Наприклад, сусідні етапи можуть бути об'єднані та / або упорядковані для поліпшення виконання, не впливаючи на вихідні результати.
Обмеження
Як і в MongoDB 3.4, параметр Aggregation Framework explain
надає інформацію про те, як обробляється конвеєр, але не підтримує той же рівень деталізації, що і executionStats
режим find()
запиту. Якщо ви зосереджені на оптимізації виконання початкового запиту, вам, ймовірно, буде корисно переглянути еквівалентний find().explain()
запит executionStats
або allPlansExecution
багатослівність .
Існує декілька відповідних запитів на функцію перегляду / оновлення у трекері випуску MongoDB щодо детальніших статистичних даних щодо виконання, щоб допомогти оптимізувати / профілі агрегації трубопроводів: