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

cara menyusun indeks majemuk di mongodb

Itu banyak pertanyaan dalam satu posting;) Biarkan saya membahasnya secara praktis :

  • Setiap kueri dapat menggunakan paling banyak satu indeks (dengan pengecualian $atau klausa tingkat atas dan semacamnya). Ini termasuk penyortiran apa pun.
  • Karena hal di atas, Anda pasti memerlukan indeks gabungan untuk masalah Anda daripada indeks per bidang yang terpisah.
  • Bidang kardinalitas rendah (jadi, bidang dengan nilai unik yang sangat sedikit di seluruh kumpulan data Anda) biasanya tidak boleh ada dalam indeks karena selektivitasnya sangat terbatas.
  • Urutan bidang dalam indeks gabungan Anda penting, dan begitu pula arah relatif setiap bidang dalam indeks gabungan Anda (mis. "{name:1, age:-1}"). Ada banyak dokumentasi tentang indeks gabungan dan arah bidang indeks di mongodb.org jadi saya tidak akan mengulangi semuanya di sini.
  • Urutan hanya akan menggunakan indeks jika bidang pengurutan ada dalam indeks dan merupakan bidang dalam indeks langsung setelah bidang terakhir yang digunakan untuk memilih kumpulan hasil. Dalam kebanyakan kasus, ini akan menjadi bidang terakhir dari indeks.

Jadi, Anda tidak boleh memasukkan status dalam indeks Anda sama sekali karena setelah perjalanan indeks telah menghilangkan sebagian besar dokumen berdasarkan bidang kardinalitas yang lebih tinggi, paling banyak akan memiliki 2-3 dokumen yang tersisa dalam banyak kasus yang hampir tidak dioptimalkan oleh indeks status (terutama karena Anda menyebutkan 2-3 dokumen tersebut kemungkinan besar memiliki status yang sama).

Sekarang, catatan terakhir yang relevan dalam kasus Anda adalah bahwa ketika Anda menggunakan kueri rentang (dan memang demikian), itu tidak akan menggunakan indeks untuk menyortir. Anda dapat memeriksa ini dengan melihat nilai "scanAndOrder" dari explain() Anda setelah Anda menguji kueri Anda. Jika nilai itu ada dan benar, itu berarti ia akan mengurutkan hasil dalam memori (pindai dan pesan) daripada menggunakan indeks secara langsung. Ini tidak dapat dihindari dalam kasus khusus Anda.

Jadi, indeks Anda seharusnya :

db.posts.ensureIndex({start:1, end:1})

dan kueri Anda (pesanan diubah hanya untuk kejelasan, pengoptimal kueri akan menjalankan kueri asli Anda melalui jalur eksekusi yang sama tetapi saya lebih suka menempatkan bidang yang diindeks terlebih dahulu dan berurutan):

db.posts.find({start: {$lt: today}, end: {$gt: today}, status: {$gte:0}}).sort({sortOrder:1})



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mengimpor Date-datatype menggunakan mongoimport

  2. Operator MongoDB $gt/$lt dengan harga disimpan sebagai string

  3. Bagaimana cara mendengarkan perubahan pada koleksi MongoDB?

  4. Bagaimana cara terhubung ke MongoDB di Windows?

  5. Meminta array array di MongoDB