Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Indeks majemuk dengan lebih dari 3 atribut
Ikhtisar
Indeks senyawa atau komposit mempertahankan referensi ke beberapa bidang dalam struktur indeks tunggal. Indeks ini mengoptimalkan kinerja untuk kueri yang memfilter pada beberapa bidang secara bersamaan atau menggabungkan pemfilteran dengan operasi penyortiran. Mereka juga efektif untuk kueri kondisi tunggal di bidang terindeks paling kiri. Basis data memanfaatkan entri indeks ini untuk secara efisien menemukan dokumen yang cocok tanpa melakukan pemindaian koleksi lengkap.
Amazon DocumentDB dapat menggunakan indeks gabungan untuk mendukung kueri yang menyertakan subset terdepan dari bidang yang diindeks, sebuah konsep yang dikenal sebagai Index Prefixes. Misalnya, jika Anda memiliki indeks gabungan{state: 1, city: 1, zipcode: 1}, Amazon DocumentDB dapat secara efisien memproses kueri yang menggunakan bidang 'status' saja, bidang 'status' dan 'kota' bersama-sama, atau ketiga bidang 'status', 'kota', dan 'zipcode'. Namun, kueri harus menggunakan bidang dari kiri ke kanan tanpa melewatkan bidang apa pun di antaranya. Ini berarti kueri hanya menggunakan bidang 'kota' atau 'kode pos', atau kombinasi seperti 'negara' dan 'kode pos' (melewatkan 'kota'), tidak dapat sepenuhnya memanfaatkan indeks.
Dalam sebagian besar skenario dunia nyata, indeks gabungan dengan tiga atau lebih sedikit atribut biasanya mencapai kinerja optimal dan efisiensi sumber daya. Meskipun layak untuk memiliki lebih dari 3 atribut dalam indeks komposit, sering kali mengarah pada peningkatan konsumsi sumber daya, melebihi manfaatnya.
Dampak pada cluster
Meskipun tergoda untuk membuat indeks yang mencakup semua kondisi dalam kueri untuk mencapai kinerja teoritis maksimum, sebagian besar penyaringan data terjadi melalui 1-3 atribut pertama dalam indeks komposit. Bidang tambahan di luar ambang batas ini berkontribusi terutama pada ukuran indeks daripada pengoptimalan kueri yang berarti.
Penyimpanan dan I/O Overhead: Indeks komposit dengan banyak atribut mengkonsumsi ruang penyimpanan yang jauh lebih banyak daripada alternatif yang lebih sederhana. Ukurannya berbanding lurus dengan jumlah atribut yang diindeks, dan ukuran nilai yang diindeks itu sendiri.
Jejak memori: Jejak penyimpanan besar indeks komposit dengan banyak atribut menciptakan jejak yang sesuai dalam memori, membuat set kerja Anda lebih besar dan memindahkan data lain yang sering diakses dari kumpulan buffer.
Operasi Tulis: Setiap modifikasi dokumen yang memengaruhi beberapa bidang yang diindeks memerlukan pembaruan seluruh entri indeks komposit, mengalikan pekerjaan yang diperlukan untuk menyelesaikan operasi penulisan.
Bagaimana cara mengidentifikasi
Mulailah dengan meninjau semua indeks dalam koleksi Anda untuk mengidentifikasi indeks komposit dengan lebih dari tiga atribut:
// List all indexes for the collection db.collection.getIndexes() // Look for indexes with 3+ fields like: // { "userId": 1, "status": 1, "category": 1, "priority": 1, "region": 1 } // { "orderId": 1, "customerId": 1, "productId": 1, "timestamp": 1, "warehouse": 1 }
Remediasi
Jika indeks komposit dengan lebih dari tiga atribut sedang digunakan, identifikasi kueri yang menggunakannya dan cari peluang optimasi. Pertimbangkan untuk mengganti indeks ini dengan yang lebih efisien yang mengandung tiga atau lebih sedikit atribut. Setelah menerapkan indeks baru, hapus indeks lama yang berisi lebih dari tiga atribut.
catatan
Selalu berkoordinasi dengan pemangku kepentingan dan validasi dampak kinerja sebelum menjatuhkan indeks apa pun.
Ikuti aturan Equality, Sort, Range (ESR) saat membuat indeks komposit.
Aturan Equality Sort Range (ESR): Urutan ini memaksimalkan efisiensi indeks dengan memfilter kumpulan data terlebih dahulu dengan kondisi kesetaraan, kemudian menerapkan operasi pengurutan pada set yang dikurangi, dan akhirnya melakukan pemindaian rentang pada subset sekecil mungkin
-
bidang pesanan sebagai Kesetaraan (kecocokan persis),
-
Urutkan (memesan),
-
Rentang (>, <, $ in).
// Query pattern db.orders.find({ userId: "user123", // Equality price: { $gte: 50, $lte: 200 } // Range }).sort({ createdAt: -1 }) // Sort // Optimal index following ESR rule db.orders.createIndex({ userId: 1, createdAt: -1, price: 1 }) // Equality Sort Range