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

Mengapa paket kueri MongoDB yang berbeda menunjukkan nilai nReturned yang berbeda?

Hal ini dijelaskan dalam allPlansExecution Mode halaman dokumentasi. Untuk parafrase:

Selama pemilihan paket, jika ada lebih dari satu indeks yang dapat memenuhi kueri, MongoDB akan menjalankan uji coba menggunakan semua paket yang valid untuk menentukan mana yang berkinerja terbaik. Lihat Paket Kueri untuk detail tentang proses ini.

Pada MongoDB 3.4.6, pemilihan rencana melibatkan menjalankan rencana kandidat secara paralel dalam "perlombaan", dan melihat rencana kandidat mana yang mengembalikan 101 hasil terlebih dahulu. Dalam contoh Anda di atas, pada saat rencana pemenang mengembalikan 101 hasil dalam perlombaan, rencana yang kalah hanya menghasilkan 2 hasil. Rencana kemenangan kemudian akan dieksekusi sampai selesai. Inilah alasan mengapa rencana yang kalah hanya menampilkan nReturned: 2 dalam statistik.

"Perlombaan" ini dilakukan karena jika ada dua paket yang tampak identik, MongoDB tidak tahu paket mana yang terbaik untuk kueri tertentu karena fleksibilitas dokumen JSON (tidak seperti misalnya SQL di mana struktur tabel diketahui) . Tentu saja, sangat mungkin bahwa tebakan MongoDB salah, dan berakhir dengan rencana yang kurang berkinerja, karena ini adalah proses empiris. Untuk alasan ini, yang terbaik adalah membuat indeks yang mendukung kueri Anda sehingga MongoDB tidak perlu menebak. Jika tidak, Anda dapat menggunakan hint() untuk memberi tahu MongoDB indeks mana yang akan digunakan untuk kueri tertentu.

Oleh karena itu:

  • Statistik untuk rencana pemenang adalah statistik hasil kueri yang sebenarnya.
  • Statistik untuk rencana yang kalah hanya menunjukkan statistik untuk uji coba perencanaan kueri.
  • Pemilihan rencana melibatkan menjalankan "perlombaan" ke 101 hasil. Perlombaan ini hanya dilakukan bila ada beberapa indeks yang dapat memenuhi kueri.

Catatan 1 :Tak satu pun dari dua rencana yang Anda lihat itu bagus. Paket pemenang menunjukkan "nReturned" : 43 , "totalKeysExamined" : 221 , dan "totalDocsExamined" : 219 . Ini berarti bahwa MongoDB perlu memeriksa 219 dokumen hanya untuk mengembalikan 43 di antaranya:efisiensi hanya 20% . Idealnya, Anda ingin memiliki nReturned angka sama dengan totalDocsExamined .

Catatan 2 :Coba buat indeks gabungan {'rack_name': 1, 'timestamp': 1} . Dengan kueri yang sama, Anda akan mendapatkan angka efisiensi yang lebih baik.

Catatan 3 :Perhatikan bahwa sejak allPlansExecution telah ditentukan, semua statistik dikembalikan kepada Anda oleh MongoDB untuk ketelitian, sementara itu tidak ada hubungannya dengan nReturned akhir hasil. Itu adalah rencana yang ditolak, dan nReturned: 2 nomor bisa membingungkan. Anda tidak akan melihat statistik ini jika menggunakan executionStats pengaturan. Terutama, allPlansExecution digunakan untuk menyempurnakan dan menentukan mengapa beberapa rencana ditolak.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Luwak {strict:throw} tidak melempar kesalahan

  2. Apakah mungkin untuk mengganti dividen dan pembagi dari operator kueri $mod MongoDB?

  3. Perbarui array Mongo:hapus kunci dinamis

  4. menggunakan :=memberikan kesalahan yang tidak digunakan tetapi menggunakan =tidak di Go

  5. Praktik terbaik MongoDB untuk menghitung dokumen terkait