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
$match
tahap untuk membatasi pemrosesan ke dokumen yang relevan. - Memastikan
$match
awal /$sort
tahapan 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"