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

Bagaimana urutan indeks gabungan penting dalam kinerja MongoDB?

Redsandro,

Anda harus mempertimbangkan Index Cardinality dan Selectivity .

1. Indeks Kardinalitas

Kardinalitas indeks mengacu pada berapa banyak nilai yang mungkin ada untuk suatu bidang. Bidang sex hanya memiliki dua nilai yang mungkin. Ini memiliki kardinalitas yang sangat rendah . Bidang lain seperti names, usernames, phone numbers, emails , dll. akan memiliki nilai yang lebih unik untuk setiap dokumen dalam koleksi, yang dianggap kardinalitas tinggi .

  • Kardinalitas Lebih Besar

    Semakin besar kardinalitas suatu bidang, indeks akan semakin membantu, karena indeks mempersempit ruang pencarian, menjadikannya kumpulan yang jauh lebih kecil.

    Jika Anda memiliki indeks pada sex dan Anda mencari pria bernama John. Anda hanya akan mempersempit ruang hasil sekitar %50 jika Anda diindeks berdasarkan sex pertama. Sebaliknya jika Anda diindeks oleh name , Anda akan segera mempersempit hasil yang disetel ke sebagian kecil pengguna bernama John, lalu Anda akan merujuk ke dokumen tersebut untuk memeriksa jenis kelaminnya.

  • Aturan Praktis

    Coba buat indeks pada high-cardinality kunci atau masukkan high-cardinality kunci pertama dalam indeks majemuk. Anda dapat membaca lebih lanjut tentang itu di bagian indeks majemuk dalam buku:

    Panduan Definitif MongoDB

2. Selektivitas

Selain itu, Anda ingin menggunakan indeks secara selektif dan menulis kueri yang membatasi jumlah kemungkinan dokumen dengan bidang yang diindeks. Untuk membuatnya tetap sederhana, perhatikan koleksi berikut. Jika indeks Anda adalah {name:1} , Jika Anda menjalankan kueri { name: "John", sex: "male"} . Anda harus memindai 1 dokumen. Karena Anda mengizinkan MongoDB untuk selektif.

{_id:ObjectId(),name:"John",sex:"male"}
{_id:ObjectId(),name:"Rich",sex:"male"}
{_id:ObjectId(),name:"Mose",sex:"male"}
{_id:ObjectId(),name:"Sami",sex:"male"}
{_id:ObjectId(),name:"Cari",sex:"female"}
{_id:ObjectId(),name:"Mary",sex:"female"}

Simak koleksi berikut ini. Jika indeks Anda {sex:1} , Jika Anda menjalankan kueri {sex: "male", name: "John"} . Anda harus memindai 4 dokumen.

{_id:ObjectId(),name:"John",sex:"male"}
{_id:ObjectId(),name:"Rich",sex:"male"}
{_id:ObjectId(),name:"Mose",sex:"male"}
{_id:ObjectId(),name:"Sami",sex:"male"}
{_id:ObjectId(),name:"Cari",sex:"female"}
{_id:ObjectId(),name:"Mary",sex:"female"}

Bayangkan perbedaan yang mungkin terjadi pada kumpulan data yang lebih besar.

Sedikit penjelasan tentang Indeks Majemuk

Sangat mudah untuk membuat asumsi yang salah tentang Indeks Senyawa. Menurut dokumen MongoDB tentang Indeks Senyawa.

MongoDB mendukung indeks majemuk, di mana struktur indeks tunggal menyimpan referensi ke beberapa bidang dalam dokumen koleksi. Diagram berikut mengilustrasikan contoh indeks gabungan pada dua bidang:

Saat Anda membuat indeks gabungan, 1 Indeks akan menampung banyak bidang. Jadi jika kita mengindeks suatu koleksi dengan {"sex" : 1, "name" : 1} , indeksnya kira-kira akan terlihat seperti:

["male","Rick"] -> 0x0c965148
["male","John"] -> 0x0c965149
["male","Sean"] -> 0x0cdf7859
["male","Bro"] ->> 0x0cdf7859
...
["female","Kate"] -> 0x0c965134
["female","Katy"] -> 0x0c965126
["female","Naji"] -> 0x0c965183
["female","Joan"] -> 0x0c965191
["female","Sara"] -> 0x0c965103

Jika kita mengindeks koleksi dengan {"name" : 1, "sex" : 1} , indeksnya kira-kira akan terlihat seperti:

["John","male"] -> 0x0c965148
["John","female"] -> 0x0c965149
["John","male"] -> 0x0cdf7859
["Rick","male"] -> 0x0cdf7859
...
["Kate","female"] -> 0x0c965134
["Katy","female"] -> 0x0c965126
["Naji","female"] -> 0x0c965183
["Joan","female"] -> 0x0c965191
["Sara","female"] -> 0x0c965103

Memiliki {name:1} sebagai Awalan akan melayani Anda lebih baik dalam menggunakan indeks majemuk. Masih banyak lagi yang bisa dibaca tentang topik ini, saya harap ini bisa memberikan kejelasan.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Basis Data NoSQL Paling Populer yang Didukung oleh ClusterControl

  2. Cara menangkap pengecualian saat membuat instance MongoClient

  3. Luwak Tidak Membuat Indeks

  4. Masalah untuk menjalankan contoh di Meteor

  5. (MongoDB Java) $push ke dalam array