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

MongoDB Temukan kinerja:indeks gabungan tunggal VS dua indeks bidang tunggal

Diberikan kueri standar biasa (tanpa limit() atau sort() atau apa pun yang mewah diterapkan) yang memiliki kondisi filter pada dua bidang (seperti dalam name dan age dalam contoh Anda), untuk menemukan dokumen yang dihasilkan, MongoDB akan:

  1. lakukan pemindaian koleksi full (baca setiap dokumen di seluruh koleksi, uraikan BSON, temukan nilai yang dimaksud, uji terhadap input dan kembalikan/buang setiap dokumen):Ini sangat intens I/O dan karenanya lambat.
  2. gunakan satu indeks yang memegang salah satu bidang (gunakan pohon indeks untuk menemukan subset dokumen yang relevan diikuti dengan pemindaiannya):Bergantung pada distribusi data/selektivitas indeks Anda, ini bisa sangat cepat atau hampir tidak memberikan manfaat apa pun (bayangkan indeks pada age dalam kumpulan data jutaan orang antara 30 dan 40 tahun --> setiap pencarian akan tetap menghasilkan dokumen dalam jumlah tak terbatas).
  3. gunakan dua indeks yang bersama-sama berisi kedua bidang yang dimaksud (muat kedua indeks, lakukan pencarian kunci, lalu hitung persimpangan hasil):Sekali lagi, tergantung pada distribusi data Anda, ini mungkin memberi Anda kinerja yang hebat atau tidak. Namun, dalam banyak kasus seharusnya lebih cepat dari #2. Namun, saya akan terkejut jika itu benar-benar 10x lebih lambat dari #4 (seperti yang Anda sebutkan).
  4. gunakan indeks gabungan (dua pencarian kunci berikutnya segera mengarah ke dokumen yang diperlukan):Ini akan menjadi opsi tercepat dari semuanya karena memerlukan operasi paling sedikit dan termurah untuk mendapatkan dokumen yang tepat. Untuk memastikan tingkat penggunaan kembali terbesar (bukan kinerja yang tidak akan terpengaruh oleh ini), Anda harus secara umum memulai dengan bidang yang paling selektif terlebih dahulu, jadi dalam kasus Anda mungkin name dan bukan age mengingat banyak orang akan memiliki age yang sama (selektivitas sangat rendah) dibandingkan dengan name (selektivitas yang lebih tinggi). Tetapi pilihan itu juga tergantung pada skenario konkret Anda dan kueri yang ingin Anda jalankan terhadap database Anda. Ada artikel yang cukup bagus di web tentang cara terbaik untuk menentukan indeks gabungan dengan mempertimbangkan berbagai aspek dari situasi spesifik Anda:https://emptysqua.re/blog/optimizing-mongodb-compound-indexes

Aspek lain yang perlu dipertimbangkan adalah:Pembaruan indeks datang dengan harga tertentu. Namun, jika yang Anda pedulikan hanyalah kecepatan baca mentah dan Anda hanya memiliki sedikit pembaruan setiap saat, maka Anda harus menggunakan indeks yang lebih banyak/lebih besar.

Dan last but not least (!) saran garis bawah terlalu sering digunakan:Profil neraka keluar dari sistem Anda menggunakan data nyata dan bahkan mungkin skenario beban realistis. Dan juga terus mengukur saat data/sistem Anda berubah seiring waktu.

Bacaan tambahan:https://docs.mongodb.com/manual/core/query-optimization/index.html

https://dba.stackexchange.com/questions/158240/mongodb-index-intersection-does-not-eliminate-the-need-for-creating-compound-in

Persimpangan indeks vs. indeks majemuk?

indeks gabungan mongodb vs. indeks berpotongan

Bagaimana urutan indeks gabungan penting dalam kinerja MongoDB?

Di MongoDB, saya menggunakan kueri besar, bagaimana saya akan membuat indeks gabungan atau indeks tunggal, Jadi waktu respons saya meningkat




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Kelompokkan dan hitung dengan syarat

  2. Mencocokkan ObjectId ke String untuk $graphLookup

  3. MongoDB vs. DynamoDB:Apa yang perlu Anda ketahui

  4. mongodb versi 3.0.0 klien robomongo mongovue

  5. Cara deserialize objek BsonDocument kembali ke kelas