Dimulai dengan MongoDB versi 3.0, cukup ubah urutannya dari
collection.aggregate(...).explain()
untuk
collection.explain().aggregate(...)
akan memberi Anda hasil yang diinginkan (dokumentasi di sini).
Untuk versi lama>=2.6, Anda perlu menggunakan explain opsi untuk operasi pipeline agregasi
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
}
)
Pertimbangan penting dengan Kerangka Agregasi adalah bahwa indeks hanya dapat digunakan untuk mengambil data awal untuk saluran (misalnya penggunaan $match , $sort , $geonear di awal pipeline) serta $lookup subsequent berikutnya dan $graphLookup tahapan. Setelah data diambil ke dalam alur agregasi untuk diproses (mis. melewati tahapan seperti $project , $unwind , dan $group ) manipulasi lebih lanjut akan berada di dalam memori (mungkin menggunakan file sementara jika allowDiskUse opsi disetel).
Mengoptimalkan pipeline
Secara umum, Anda dapat mengoptimalkan pipeline agregasi dengan:
- Memulai pipeline dengan
$matchtahap untuk membatasi pemrosesan ke dokumen yang relevan. - Memastikan
$matchawal /$sorttahapan didukung oleh indeks yang efisien. - Memfilter data lebih awal menggunakan
$match,$limit, dan$skip. - Meminimalkan tahapan yang tidak perlu dan manipulasi dokumen (mungkin mempertimbangkan kembali skema Anda jika diperlukan senam agregasi yang rumit).
- Memanfaatkan operator agregasi yang lebih baru jika Anda telah meningkatkan server MongoDB Anda. Misalnya, MongoDB 3.4 menambahkan banyak tahapan dan ekspresi agregasi baru termasuk dukungan untuk bekerja dengan array, string, dan faset.
Ada juga sejumlah Pengoptimalan Pipa Agregasi yang secara otomatis terjadi tergantung pada versi server MongoDB Anda. Misalnya, tahapan yang berdekatan dapat digabungkan dan/atau disusun ulang untuk meningkatkan eksekusi tanpa mempengaruhi hasil keluaran.
Batasan
Seperti pada MongoDB 3.4, Kerangka Agregasi explain option memberikan informasi tentang bagaimana pipeline diproses tetapi tidak mendukung tingkat detail yang sama dengan executionStats mode untuk find() pertanyaan. Jika Anda berfokus pada pengoptimalan eksekusi kueri awal, kemungkinan besar akan bermanfaat untuk meninjau find().explain() yang setara kueri dengan executionStats atau allPlansExecution verbositas.
Ada beberapa permintaan fitur yang relevan untuk diperhatikan/di-upvote di pelacak masalah MongoDB mengenai statistik eksekusi yang lebih mendetail untuk membantu mengoptimalkan/memprofilkan alur agregasi:
- SERVER-19758:Tambahkan mode penjelasan "executionStats" dan "allPlansExecution" ke penjelasan agregasi
- SERVER-21784:Lacak statistik eksekusi untuk setiap tahap alur agregasi dan paparkan melalui penjelasan
- SERVER-22622:Tingkatkan penjelasan $lookup untuk menunjukkan rencana kueri pada koleksi "dari"