Bắt đầu với MongoDB phiên bản 3.0, chỉ cần thay đổi thứ tự từ
collection.aggregate(...).explain()
đến
collection.explain().aggregate(...)
sẽ cung cấp cho bạn kết quả mong muốn (tài liệu tại đây ).
Đối với các phiên bản cũ hơn> = 2.6, bạn sẽ cần sử dụng explain
tùy chọn cho các hoạt động đường ống tổng hợp
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
}
)
Một yếu tố quan trọng với khung Aggregation là một chỉ số chỉ có thể được sử dụng để lấy dữ liệu ban đầu cho một đường ống dẫn (ví dụ sử dụng $match
, $sort
, $geonear
vào lúc bắt đầu của một đường ống dẫn) cũng như sau này $lookup
và $graphLookup
giai đoạn. Khi dữ liệu đã được lấy vào các đường ống dẫn tập hợp để xử lý (ví dụ như đi qua các giai đoạn như $project
, $unwind
và $group
) thao tác sẽ tiếp tục được trong bộ nhớ (có thể sử dụng tập tin tạm thời nếu allowDiskUse
lựa chọn là bộ).
Tối ưu hóa đường ống
Nói chung, bạn có thể tối ưu hóa các đường ống tổng hợp bằng cách:
- Bắt đầu một đường dẫn với một
$match
giai đoạn để hạn chế xử lý các tài liệu có liên quan.
- Đảm bảo các giai đoạn
$match
/ ban đầu $sort
được hỗ trợ bởi một chỉ mục hiệu quả .
- Dữ liệu lọc đầu sử dụng
$match
, $limit
và $skip
.
- Giảm thiểu các giai đoạn không cần thiết và thao tác tài liệu (có thể xem xét lại giản đồ của bạn nếu yêu cầu thể dục tổng hợp phức tạp).
- Tận dụng các toán tử tổng hợp mới hơn nếu bạn đã nâng cấp máy chủ MongoDB của mình. Ví dụ: MongoDB 3.4 đã thêm nhiều giai đoạn và biểu thức tổng hợp mới bao gồm hỗ trợ làm việc với mảng, chuỗi và khía cạnh.
Ngoài ra còn có một số Tối ưu hóa đường ống tổng hợp tự động xảy ra tùy thuộc vào phiên bản máy chủ MongoDB của bạn. Ví dụ, các giai đoạn liền kề có thể được liên kết và / hoặc sắp xếp lại thứ tự để cải thiện việc thực hiện mà không ảnh hưởng đến kết quả đầu ra.
Hạn chế
Như trong MongoDB 3.4, explain
tùy chọn Khung tổng hợp cung cấp thông tin về cách xử lý đường dẫn nhưng không hỗ trợ mức chi tiết giống như executionStats
chế độ cho find()
truy vấn. Nếu bạn đang tập trung vào việc tối ưu hóa việc thực thi truy vấn ban đầu, bạn có thể sẽ thấy có lợi khi xem lại find().explain()
truy vấn tương đương với executionStats
hoặc độ allPlansExecution
dài .
Có một số yêu cầu tính năng liên quan để xem / ủng hộ trong trình theo dõi vấn đề MongoDB liên quan đến số liệu thống kê thực thi chi tiết hơn để giúp tối ưu hóa / đường ống tổng hợp hồ sơ: