Pengoptimal kueri MongoDB bekerja dengan mencoba berbagai paket untuk menentukan pendekatan mana yang paling cocok untuk kueri tertentu. Rencana pemenang untuk pola kueri tersebut kemudian di-cache untuk ~1.000 kueri berikutnya atau hingga Anda melakukan explain()
.
Untuk memahami rencana kueri mana yang dipertimbangkan, Anda harus menggunakan explain(1)
, misalnya:
db.col.find({category:'A'}).sort({updated: -1}).explain(1)
allPlans
detail akan menampilkan semua rencana yang dibandingkan.
Jika Anda menjalankan kueri yang tidak terlalu selektif (misalnya, jika banyak catatan cocok dengan kriteria Anda {category: { $ne:'A'}}
), mungkin lebih cepat bagi MongoDB untuk menemukan hasil menggunakan BasicCursor (pemindaian tabel) daripada mencocokkan dengan indeks.
Urutan bidang dalam kueri umumnya tidak membuat perbedaan untuk pemilihan indeks (ada beberapa pengecualian dengan kueri rentang). Urutan bidang dalam sort mempengaruhi pemilihan indeks. Jika sort()
. Anda kriteria tidak sesuai dengan urutan indeks, data hasil harus diurutkan ulang setelah indeks digunakan (Anda akan melihat scanAndOrder:true
dalam output jelaskan jika ini terjadi).
Perlu juga dicatat bahwa MongoDB hanya akan menggunakan satu indeks per kueri (dengan pengecualian $or
s).
Jadi, jika Anda mencoba mengoptimalkan kueri:
db.col.find({category:'A'}).sort({updated: -1, rating: -1})
Anda akan ingin memasukkan ketiga bidang dalam indeks:
db.col.ensureIndex({category: 1, updated: -1, rating: -1})
FYI, jika Anda ingin memaksa kueri tertentu untuk menggunakan indeks (umumnya tidak diperlukan atau disarankan), ada hint()
pilihan yang bisa Anda coba.