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

Indeks Senyawa Tiga Mongo

garis bawah / tl;dr: Indeks b dapat 'dilewati' jika a dan c ditanyai untuk kesetaraan atau ketidaksetaraan, tetapi tidak, misalnya, untuk pengurutan pada c .

Ini adalah pertanyaan yang sangat bagus. Sayangnya, saya tidak dapat menemukan apa pun yang secara otoritatif menjawab ini secara lebih rinci. Saya yakin kinerja kueri semacam itu telah meningkat selama beberapa tahun terakhir, jadi saya tidak akan mempercayai materi lama tentang topik tersebut.

Semuanya cukup rumit karena bergantung pada selektivitas pada indeks Anda dan apakah Anda menanyakan kesetaraan, ketidaksetaraan, dan/atau pengurutan, jadi explain() adalah satu-satunya teman Anda, tetapi inilah beberapa hal yang saya temukan:

Peringatan :Yang muncul sekarang adalah campuran hasil eksperimen, penalaran dan tebak-tebakan. Saya mungkin terlalu jauh memperluas analogi Kyle, dan Saya bahkan mungkin sepenuhnya salah (dan sial, karena hasil tes saya tidak sesuai dengan alasan saya).

Jelas bahwa indeks A dapat digunakan, yang, tergantung pada selektivitas A, tentu sangat membantu. 'Melewati' B bisa rumit, atau tidak. Mari kita buat ini mirip dengan contoh buku masak Kyle:

French
    Beef
        ...
    Chicken
        Coq au Vin
        Roasted Chicken
    Lamb
        ...
    ...

Jika sekarang Anda meminta saya untuk menemukan beberapa hidangan Prancis yang disebut "Chateaubriand", saya dapat menggunakan indeks A dan, karena saya tidak tahu bahannya, saya harus memindai semua hidangan di A . Di sisi lain, saya tahu bahwa daftar hidangan di setiap kategori diurutkan melalui indeks C , jadi saya hanya perlu mencari string yang dimulai dengan, katakanlah, "Cha" di setiap daftar bahan. Jika ada 50 bahan, saya akan membutuhkan 50 pencarian, bukan hanya satu, tapi itu jauh lebih baik daripada harus memindai setiap hidangan Prancis!

Dalam percobaan saya, jumlahnya jauh lebih kecil daripada jumlah nilai yang berbeda di b :sepertinya tidak pernah melebihi 2. Namun, saya menguji ini hanya dengan satu koleksi, dan mungkin ada hubungannya dengan selektivitas b -indeks.

Jika Anda meminta saya untuk memberi Anda daftar semua hidangan Prancis yang diurutkan berdasarkan abjad , meskipun demikian, saya akan berada dalam masalah . Sekarang indeks pada C tidak berharga, saya harus menggabungkan-mengurutkan semua daftar indeks itu. Saya harus memindai setiap elemen untuk melakukannya.

Ini tercermin dalam pengujian saya. Berikut adalah beberapa hasil yang disederhanakan. Koleksi aslinya memiliki datetimes, ints, dan strings, tapi saya ingin menjaga semuanya tetap sederhana, jadi sekarang semuanya int.

Pada dasarnya, hanya ada dua kelas kueri:kelas kueri yang nscanned <=2 * limit , dan mereka yang harus memindai seluruh koleksi (120rb dokumen). Indeksnya adalah {a, b, c} :

// fast (range query on c while skipping b)
> db.Test.find({"a" : 43, "c" : { $lte : 45454 }});
// slow (sorting)
> db.Test.find({"a" : 43, "c" : { $lte : 45454 }}).sort({ "c" : -1});
> db.Test.find({"a" : 43, "c" : { $lte : 45454 }}).sort({ "b" : -1}); 

// fast (can sort on c if b included in the query)
> db.Test.find({"a" : 43, "b" : 7887, "c" : { $lte : 45454 }}).sort({ "c" : -1});

// fast (older tutorials claim this is slow)
> db.Test.find({"a" : {$gte : 43}, "c" : { $lte : 45454 }});

Jarak tempuh Anda akan bervariasi.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Memperbarui Array Bersarang dengan MongoDB

  2. Mengapa kita perlu, apa keuntungan menggunakan luwak?

  3. MongoDB pilih di mana dalam array _id?

  4. Perbarui Dan Kembalikan Dokumen Di Mongodb

  5. Skema Mongoose belum terdaftar untuk model