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

Memahami Indeks MongoDB

Di antara tugas-tugas yang terlibat dalam manajemen database adalah meningkatkan kinerja dengan menggunakan strategi yang berbeda. Pengindeksan adalah salah satu tips yang meningkatkan operasi throughput dengan memfasilitasi akses data ke permintaan kueri. Ia melakukannya dengan meminimalkan jumlah akses disk yang diperlukan saat kueri diproses. Kegagalan menggunakan indeks di MongoDB akan memaksa database untuk melakukan pemindaian koleksi lengkap, yaitu, memindai semua dokumen dalam koleksi untuk memilih dokumen yang cocok dengan pernyataan kueri yang dikeluarkan. Jelas, ini akan memakan banyak waktu terutama jika ada begitu banyak dokumen yang terlibat. Singkatnya, indeks mendukung eksekusi kueri yang efisien.

Indeks MongoDB

Karena kami berharap untuk menyimpan banyak dokumen dalam koleksi MongoDB, kami perlu menemukan cara untuk menyimpan sebagian kecil data untuk setiap dokumen di partisi yang berbeda agar mudah dilintasi dengan menggunakan indeks. Indeks akan menyimpan nilai bidang atau bidang tertentu dan kemudian mengurutkan data ini dalam urutan nilai bidang itu. Dengan pengurutan ini, pencocokan kueri yang efisien dan operasi kueri berbasis rentang didukung. Indeks ditentukan pada tingkat koleksi dan didukung oleh bidang apa pun atau bidang yang disematkan dari dokumen dalam koleksi.

Saat Anda membuat dokumen, MongoDB secara default menetapkan bidang _id jika tidak ditentukan dan menjadikannya indeks unik untuk dokumen itu. Pada dasarnya, ini untuk mencegah penyisipan dokumen yang sama lebih dari yang ada di koleksi itu. Selain itu, untuk sharded cluster, disarankan untuk menggunakan bidang _id ini sebagai bagian dari pemilihan kunci shard, jika tidak, harus ada beberapa keunikan data di bidang _id untuk menghindari kesalahan.

Membuat Indeks untuk Koleksi

Dengan asumsi Anda telah memasukkan beberapa data dalam koleksi Anda dan Anda ingin menetapkan bidang menjadi indeks, Anda dapat menggunakan metode createIndex untuk mencapai ini, yaitu

Katakanlah Anda memiliki data json ini:

{
    _id:1,
    Name: “Sepp Maier”, 
    Country: “Germany”
}

Kita dapat membuat bidang Nama menjadi indeks menurun dengan:

db.collection.createIndex({Name: -1})

Metode ini membuat indeks dengan spesifikasi yang sama jika saja belum ada.

Jenis Indeks di MongoDB

MongoDB melibatkan berbagai jenis data sehingga berbagai jenis indeks diturunkan untuk mendukung jenis data dan kueri ini.

  1. Bidang Tunggal

    Menggunakan satu bidang dokumen, seseorang dapat menjadikan bidang tersebut sebagai indeks secara menaik atau menurun seperti contoh di atas. Selain itu, Anda dapat membuat indeks pada dokumen yang disematkan secara keseluruhan, misalnya:

    { 
        _id: “xyz”,
        Contact:{
            email: “[email protected]”, 
            phone:”+420 78342823” },
        Name: “Sergio”
    }

    Bidang kontak adalah dokumen yang disematkan sehingga kita dapat membuatnya menjadi indeks menaik dengan perintah:

    db.collection.createIndex({ Contact: 1})

    Dalam kueri, kami dapat mengambil dokumen seperti:

    db.collection.find({ 
        Contact: {email: “[email protected]”,
        phone:”+420 78342823”} 
    })

    Praktik terbaik adalah membuat indeks di latar belakang, terutama ketika sejumlah besar data terlibat karena aplikasi perlu mengakses data sambil membangun indeks.

  2. Indeks Gabungan

    Indeks gabungan sering digunakan untuk memfasilitasi operasi pengurutan dalam kueri dan mendukung kueri yang cocok di beberapa bidang. Sintaks untuk membuat indeks gabungan adalah:

    db.collection.createIndex( { <field0>: <type>, <field1>: <type1>, ... } )

    Membuat indeks gabungan untuk contoh data di bawah

    { 
        _id: “1”,
        Name: “Tom”,
        Age: 24,
        Score:”80”
    }
    db.collection.createIndex({ Age: 1, Score:-1})

    Pertimbangan:

    • Batas hanya 32 bidang yang dapat didukung.
    • Nilai bidang akan menentukan jenis indeks yaitu 1 naik dan -1 turun.
    • Jangan membuat indeks gabungan yang memiliki jenis indeks hash.
    • Urutan bidang yang tercantum dalam indeks gabungan adalah penting. Penyortiran akan dilakukan sesuai dengan urutan kolom.
  3. Indeks Multikunci

    Pada titik tertentu, Anda mungkin memiliki bidang dengan konten larik tersimpan. Saat bidang ini diindeks, entri indeks terpisah untuk setiap elemen dibuat. Oleh karena itu membantu kueri untuk memilih dokumen yang terdiri dari array dengan mencocokkan elemen atau elemen array. Ini dilakukan secara otomatis oleh MongoDB sehingga tidak perlu seseorang secara eksplisit menentukan tipe multikey. Dari versi 3.4, MongoDB melacak bidang yang diindeks yang menyebabkan indeks menjadi indeks multikey. Dengan pelacakan ini, mesin kueri database diizinkan untuk menggunakan batas indeks yang lebih ketat.

    Batasan Indeks Multikey

    • Hanya satu bidang larik yang dapat digunakan dalam pengindeksan multikunci untuk dokumen dalam koleksi. Yaitu. Anda tidak dapat membuat indeks multikey untuk perintah dan data di bawah
      { _id: 1, nums: [ 1, 2 ], scores: [ 30, 60 ]}
      Anda tidak dapat membuat indeks multikey
      { nums: 1, scores: 1 } 
    • Jika indeks multikunci sudah ada, Anda tidak dapat menyisipkan dokumen yang melanggar batasan ini. Ini untuk mengatakan jika kita memiliki
      { _id: 1, nums:  1, scores: [ 30, 60 ]}
      { _id: 1, nums: [ 1, 2 ], scores:  30}
      Setelah membuat indeks multikunci majemuk, upaya untuk menyisipkan dokumen di mana bidang nums dan skor adalah array, database akan gagal disisipkan.
  4. Indeks Teks

    Indeks teks sering digunakan untuk meningkatkan kueri penelusuran untuk string dalam koleksi. Mereka tidak menyimpan kata henti khusus bahasa (yaitu “the”, “a”, “atau”). Koleksi dapat memiliki paling banyak satu indeks teks. Untuk membuat indeks teks:

    db.collection.createIndex({Name:”text”})

    Anda juga dapat mengindeks beberapa bidang yaitu

    db.collection.createIndex({
        Name:”text”,
        place:”text”
    })

    Indeks gabungan dapat menyertakan kunci indeks teks dalam kombinasi dengan kunci indeks naik/turun tetapi:

    • Semua kunci indeks teks harus bersebelahan dalam dokumen spesifikasi indeks saat membuat indeks teks majemuk.
    • Tidak ada jenis indeks khusus lainnya seperti bidang indeks multikey yang harus dilibatkan dalam indeks teks majemuk.
    • Untuk melakukan pencarian $text, predikat kueri harus menyertakan kondisi kecocokan kesetaraan pada kunci sebelumnya.
  5. Indeks yang Di-Hash

    Sharding adalah salah satu teknik yang digunakan dalam MongoDB untuk meningkatkan penskalaan horizontal. Sharding sering melibatkan konsep berbasis hash dengan menggunakan indeks hash. Distribusi nilai yang lebih acak di sepanjang rentangnya digambarkan oleh indeks ini, tetapi hanya mendukung kecocokan kesetaraan dan tidak dapat mendukung kueri berbasis rentang.

Pertimbangan Operasional Keseluruhan untuk Indeks

  • Setiap indeks membutuhkan setidaknya 8kB ruang data.
  • Saat aktif, setiap indeks akan menggunakan beberapa ruang disk dan memori. Hal ini penting jika dilacak dalam perencanaan kapasitas.
  • Untuk kumpulan rasio baca-tulis yang tinggi, indeks tambahan meningkatkan kinerja dan tidak memengaruhi operasi baca yang tidak diindeks.

Batasan Penggunaan Indeks

  • Menambahkan indeks memiliki beberapa dampak kinerja negatif untuk operasi penulisan terutama untuk koleksi dengan rasio tulis-untuk-baca yang tinggi. Indeks akan mahal karena setiap sisipan juga harus memperbarui indeks apa pun.
  • MongoDB tidak akan membuat, memperbarui indeks, atau menyisipkan ke dalam koleksi terindeks jika entri indeks untuk dokumen yang ada melebihi batas kunci indeks.
  • Untuk koleksi sharding yang ada, migrasi potongan akan gagal jika potongan memiliki dokumen yang berisi bidang terindeks yang memiliki entri indeks yang melebihi batas kunci indeks.

Kesimpulan

Ada banyak cara untuk meningkatkan kinerja MongoDB, salah satunya adalah pengindeksan. Pengindeksan memfasilitasi operasi kueri dengan mengurangi latensi di mana data diambil dengan cara meminimalkan jumlah dokumen yang perlu dipindai. Namun, ada beberapa pertimbangan yang perlu dilakukan sebelum memutuskan untuk menggunakan jenis indeks tertentu. Koleksi dengan rasio read-to-write tinggi cenderung menggunakan indeks lebih baik daripada koleksi dengan operasi write-to-read tinggi.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB - Permintaan pada elemen terakhir dari sebuah array?

  2. Bagaimana cara membuat tanggal kueri di mongodb menggunakan pymongo?

  3. Pencarian bersarang MongoDB dengan 3 level

  4. Bagaimana cara menggunakan agregasi MongoDB untuk pagination?

  5. Bagaimana cara menghapus satu 'dokumen' dengan 'ID' menggunakan Driver C# Resmi untuk MongoDB?