Beberapa poin kunci dari output rencana yang dijelaskan:
- Kueri membahas atribut berikut:
siteId, status, creationDate, reportCount, assignee, parent
- Rencana kemenangan memiliki dua tahap:
- IX_SCAN menggunakan
creationDate_1_reportCount_1_label_1
, ini menggunakan pencarian yang diindeks padacreationDate
danreportCount
untuk mengidentifikasi 56 dokumen yang kemudian diteruskan ke tahap FETCH - FETCH menerima 56 dokumen dari tahap IX_SCAN dan kemudian menginterogasi dokumen-dokumen ini untuk menerapkan
siteId
,status
,assignee
danparent
filter. Interogasi ini menyebabkan 37 dokumen dibuang sehingga 19 dokumen dikembalikan.
- IX_SCAN menggunakan
Jadi, indeks Anda hanya mencakup 2 dari 6 atribut dalam kueri Anda dan 4 atribut lainnya dalam kueri Anda diterapkan dengan memeriksa dokumen bukan indeks . Jika Anda ingin kueri ini sepenuhnya tercakup dalam indeks, buat indeks berikut:
db.collection.createIndex(
{siteId: 1, status: 1, creationDate: 1, reportCount: 1, assignee: 1, parent: 1}
)
Jika Anda menjalankan kembali dengan indeks ini di tempat maka Anda akan menemukan bahwa (a) MongoDB memilih indeks ini dan (b) jumlah dokumen yang diteruskan oleh tahap IX_SCAN sama dengan jumlah dokumen yang dikembalikan oleh panggilan pencarian Anda.
Saya katakan "harus menemukan" karena ada aspek lain di sini yang mungkin mengakibatkan MongoDB memilih indeks yang berbeda mis. penggunaan $nor
dan tahap pengurutan (creationDate: 1
). Saya akan merekomendasikan mengubah indeks dan menjalankan dengan menjelaskan 'on' setelah setiap tweak dan mencari item kunci ini di executionStats
sub dokumen:
- "nKembali"
- "totalKeysExamined"
- "totalDocsDiperiksa"
Aturan praktis yang sederhana adalah ini:semakin dekat totalKeysExamined
adalah ke nReturned
dan semakin dekat totalDocsExamined
adalah nol ... semakin baik cakupan indeks Anda.
Ada juga pertanyaan tentang biaya indeks (dalam hal dampak pada waktu penulisan dan penyimpanan indeks) jadi saya sarankan mempertimbangkan persyaratan non-fungsional Anda - dapatkah waktu berlalu yang Anda inginkan dicapai tanpa cakupan indeks penuh? Jika tidak, maka Anda harus melanjutkan dengan pengujian empiris tetapi bersiaplah untuk mengubah pilihan Anda sebagai tanggapan atas apa yang explain()
keluaran memberitahu Anda.