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 cân nhắc quan trọng với Khung tổng hợp là một chỉ mục chỉ có thể được sử dụng để tìm nạp dữ liệu ban đầu cho một đường dẫn (ví dụ:sử dụng $match
, $sort
, $geonear
ở phần đầu của một đường dẫn) cũng như $lookup
tiếp theo và $graphLookup
các giai đoạn. Sau khi dữ liệu đã được tìm nạp vào quy trình tổng hợp để xử lý (ví dụ:chuyển qua các giai đoạn như $project
, $unwind
và $group
) thao tác tiếp theo sẽ nằm trong bộ nhớ (có thể sử dụng các tệp tạm thời nếu allowDiskUse
đã đặt tùy chọn).
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
$match
để hạn chế xử lý các tài liệu có liên quan. - Đảm bảo
$match
ban đầu /$sort
các giai đoạn được hỗ trợ bởi một chỉ mục hiệu quả. - Lọc dữ liệu sớm bằ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 lại 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, Khung tổng hợp explain
tùy chọn cung cấp thông tin về cách xử lý một đường dẫn nhưng không hỗ trợ cùng mức chi tiết như executionStats
chế độ cho một 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 hữu ích khi xem lại find().explain()
tương đương truy vấn 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ơ:
- SERVER-19758:Thêm các chế độ giải thích "executeStats" và "allPlansExecution" vào giải thích tổng hợp
- SERVER-21784:Theo dõi thống kê thực thi cho từng giai đoạn của quy trình tổng hợp và hiển thị thông qua giải thích
- SERVER-22622:Cải thiện $ lookup giải thích để chỉ ra kế hoạch truy vấn trên bộ sưu tập "từ"