MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Indeks rentang tanggal Mongo dengan filter

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 pada creationDate dan reportCount 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 dan parent filter. Interogasi ini menyebabkan 37 dokumen dibuang sehingga 19 dokumen dikembalikan.

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.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Java, MongoDB:Bagaimana cara memperbarui setiap objek sambil mengulangi koleksi besar?

  2. Skema belum terdaftar untuk model. Mongodb>Luwak

  3. Ingin melakukan pencadangan tambahan untuk mongodb. Jurnal? Oplog?

  4. Modul tidak ditemukan:Kesalahan:Tidak dapat menyelesaikan modul 'modul' mongodb saat menggabungkan dengan webpack

  5. 5 Cara Memeriksa Ukuran Koleksi di MongoDB