Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Index-only pemindaian (kueri tercakup)
Pemind aian khusus indeks (juga disebut kueri ter cakup) adalah pengoptimalan di mana Amazon DocumentDB menjawab kueri seluruhnya dari bidang yang disimpan dalam indeks, tanpa membaca dokumen yang mendasarinya. Karena nilai yang dibutuhkan kueri sudah ada dalam indeks, Amazon DocumentDB dapat melewatkan pengambilan setiap dokumen yang cocok, menghindari biaya acak I/O dan decoding untuk membaca dokumen lengkap. Dalam rencana kueri, pemindaian indeks saja muncul sebagai IXONLYSCAN tahap, bukan IXSCAN (pemindaian indeks) atau COLLSCAN (pemindaian koleksi). Ini mengurangi I/O dan secara signifikan dapat menurunkan latensi kueri untuk kueri yang didukung.
Kueri adalah kandidat yang baik untuk pemindaian indeks saja ketika hanya menyentuh sejumlah kecil bidang yang semuanya ada dalam satu indeks, terutama ketika dokumen itu sendiri besar. Contoh umum adalah dasbor, rollup analitik, dan pencarian yang membaca beberapa bidang dari indeks majemuk yang lebih luas.
Hasil kueri sama apakah pemindaian indeks saja digunakan atau tidak. Hanya rencana kueri, dan jumlah kinerjan I/O ya, yang berubah.
catatan
Index-only dukungan pemindaian tergantung pada versi mesin Amazon DocumentDB Anda:
-
Pro
findyeksi tercakup yang mencakup lebih dari satu non-_idbidang memerlukan mesin versi 8.0.2 atau yang lebih baru. Dalam versi sebelumnya, profindyeksi tertutup dapat mencakup paling banyak satu non-_idbidang. Proyeksi dengan dua bidang atau lebih jatuh kembali ke pemindaian indeks normal atau pemindaian koleksi. -
Index-only pemindaian untuk saluran agregasi, seperti yang tercakup
$group, memerlukan versi mesin 8.0.2 atau yang lebih baru.
Saat Amazon DocumentDB menggunakan pemindaian indeks saja
Amazon DocumentDB mempertimbangkan pemindaian hanya indeks untuk operasi berikut ketika satu indeks berisi setiap bidang yang dibaca operasi.
Pro yeksi temuan tercakup
Ku find eri memenuhi syarat ketika proyeksi adalah penyertaan sederhana dari satu atau lebih bidang tingkat atas dan setiap bidang yang diproyeksikan hadir dalam satu indeks. Misalnya, dengan indeks majemuk pada{ customerId: 1, status: 1, total: 1 }, kueri berikut dibahas. Ketiga bidang yang diproyeksikan hidup dalam indeks, dan _id secara eksplisit dikecualikan. (Meliputi proyeksi dengan lebih dari satu _id bidang non memerlukan versi mesin 8.0.2 atau yang lebih baru.)
db.orders.createIndex({ customerId: 1, status: 1, total: 1 }) db.orders.find( { customerId: 42 }, { _id: 0, customerId: 1, status: 1, total: 1 } )
Rencana kemenangan menggunakan pang IXONLYSCAN gung dan tidak pernah mengambil dokumen yang cocok dari penyimpanan:
{ "stage": "IXONLYSCAN", "indexName": "customerId_1_status_1_total_1", "direction": "forward", "indexCond": { "$and": [ { "customerId": { "$eq": 42 } } ] } }
catatan
Dalam ku find eri tercakup, bidang dalam hasil dikembalikan dalam urutan indeks (urutan bidang muncul dalam definisi indeks), bukan urutan tercantum dalam proyeksi atau urutan penyimpanan dalam dokumen. Ini cocok dengan perilaku MongoDB untuk kueri yang tercakup. Kueri yang dijawab oleh pemindaian koleksi sebagai gantinya mengembalikan bidang dalam urutan dokumen yang disimpan.
Agregasi $group yang tercakup
T $group ahap biasanya hanya membaca beberapa bidang (kunci grup dan input ke akumulatornya) tetapi sering dijalankan tanpa lead. $match Tanpa indeks penutup, Amazon DocumentDB membaca dan memecahkan kode setiap dokumen lengkap dalam koleksi hanya untuk memasukkan beberapa bidang tersebut ke dalam pengelompokan.
Index-only pemindaian untuk saluran agregasi, termasuk ta $group hapan yang tercakup, tersedia di versi mesin 8.0.2 dan yang lebih baru.
Ketika satu indeks berisi setiap bidang yang dibaca awalan pipeline, Amazon DocumentDB dapat menempatkan pemindaian indeks saja di bawah grup dan membaca bidang tersebut langsung dari indeks. Pertimbangkan pipeline yang mengelompokkan pesanan berdasarkan status dan menjumlahkan totalnya, dengan indeks majemuk pada: { status: 1, total: 1 }
db.orders.createIndex({ status: 1, total: 1 }) db.orders.aggregate([ { $group: { _id: "$status", revenue: { $sum: "$total" } } } ])
Pipeline hanya membaca status dantotal, keduanya ada dalam indeks, sehingga grup diberi makan dari pemindaian al IXONLYSCAN ih-alih pemindaian koleksi:
// Without a covering index $group <- COLLSCAN (reads and decodes every full document) // With a covering index on { status, total } $group <- IXONLYSCAN over { status, total } (reads only the referenced fields)
Yang terkemuka $match$sort,$skip,, atau $limit sebelum $group didukung. Namun, setiap bidang referensi tahapan ini (misalnya, bidang $match filter atau $sort kunci) juga harus ada dalam indeks yang sama untuk pipeline yang akan dicakup. Jika ada bidang referensi yang hilang dari indeks, Amazon DocumentDB akan kembali ke koleksi atau pemindaian indeks.
catatan
Tidak seperti pro find yeksi, a $group tidak secara implisit menyertakan dokumen_id. _idIn a $group adalah kunci grup, bukan pengidentifikasi dokumen, sehingga indeks tidak perlu berisi dokumen _id untuk menutupi pipeline.
Persyaratan untuk kueri yang tercakup
Agar Amazon DocumentDB dapat menggunakan pemindaian indeks saja, semua hal berikut harus ditahan:
-
Indeks tunggal berisi setiap bidang yang dibaca kueri. Ini termasuk bidang yang diproyeksikan untuk
find, dan kunci grup, input akumulator, dan bidang filter atau pengurutan apa pun untuk$grouppipa yang tertutup. Jika bahkan satu bidang hilang dari indeks, kueri tidak dapat dicakup. -
Proyeksi adalah penyertaan bidang tingkat atas (untuk
find). Proyeksi pengecualian, bidang yang dihitung, dan operator proyeksi seperti$slicedan$elemMatchtidak memenuhi syarat. -
Bid
_idang diperhitungkan (untukfind). Karena_iddisertakan secara default, indeks majemuk umum seperti{ a: 1, b: 1 }tidak mencakupfind({}, { a: 1, b: 1 }): implisit tidak_idada dalam indeks. Entah mengecualikan_iddari proyeksi ({ _id: 0, a: 1, b: 1 }) atau tambahkan_idke indeks. -
Filter sepenuhnya dipenuhi oleh indeks. Jika Amazon DocumentDB tidak dapat mengubah sebagian predikat kueri menjadi terikat indeks, Amazon DocumentDB menyimpan bagian tersebut sebagai filter residual, membaca dokumen untuk mengevaluasinya, dan tidak mengubah pemindaian menjadi pemindaian indeks saja. Operator seperti
$mod,$ne,$nin, dan$existsmeninggalkan filter sisa. -
Tidak ada bidang yang diproyeksikan adalah kolom multikey (array). Lihat Pembatasan.
Pembatasan
Kasus-kasus berikut tidak dapat menggunakan pemindaian indeks saja dan kembali ke pemindaian indeks normal atau pemindaian koleksi. Ini adalah perilaku yang diharapkan dan tidak pernah mempengaruhi kebenaran hasil.
-
Bidang multikey (array). Jika bidang pernah memiliki nilai array dalam dokumen apa pun, kolom indeksnya adalah multikey. Indeks multikey menyimpan satu entri per elemen array, sehingga array asli tidak dapat direkonstruksi dari indeks. Setiap kueri yang membaca bidang seperti itu tidak tercakup.
-
Jalur bertitik atau bersarang. Proyeksi atau referensi bidang pada jalur bersarang seperti
"address.city"tidak memenuhi syarat, bahkan jika indeks berisi jalur itu. -
Pengecualian, komputasi, atau proyeksi operator. Proyeksi seperti
{ b: 0 }{ total: { $add: ["$price", "$tax"] } },, atau{ a: { $slice: 5 } }memerlukan dokumen lengkap dan tidak tercakup. -
Whole-document referensi dalam agregasi. A
$groupyang mereferensikan seluruh dokumen (misalnya,{ $push: "$$ROOT" }) tidak dapat dicakup, karena tidak ada indeks yang dapat merekonstruksi seluruh dokumen. -
Tahap membentuk kembali sebelumnya.
$groupTahap yang membentuk ulang dokumen (seperti$project,,$addFields$unwind, atau$lookup) yang muncul sebelum mendisku$groupalifikasi pipa agar tidak dicakup. -
Ketidakcocokan kolasi pada predikat string. Jika kolasi kueri berbeda dari kolasi indeks, predikat string tidak dapat dilayani oleh indeks dan meninggalkan filter residual, yang memaksa pengambilan dokumen. Predikat numerik dan berbasis tipe tidak terpengaruh.
Mengonfirmasi pemindaian indeks saja
Gunakan explain("executionStats") output untuk mengonfirmasi bahwa kueri dilayani oleh pemindaian indeks saja dan tidak menyentuh dokumen. Carilah dua hal:
-
Rencana kemenangan menggunakan pang
IXONLYSCANgung. -
docsExaminedNilai pada tahap itu adalah0(dantotalDocsExaminedsedang0), yang berarti kueri dijawab sepenuhnya dari indeks tanpa membaca dokumen apa pun.
db.orders.find( { customerId: 42 }, { _id: 0, customerId: 1, status: 1, total: 1 } ).explain("executionStats").executionStats
{ "executionSuccess": true, "nReturned": "2", "executionTimeMillis": "0.714", "totalDocsExamined": "0", "executionStages": { "stage": "IXONLYSCAN", "nReturned": "2", "indexName": "customerId_1_status_1_total_1", "direction": "forward", "docsExamined": "0" } }
catatan
Nilai bukan nol docsExamined pada pang IXONLYSCAN gung berarti indeks berisi data, tetapi Amazon DocumentDB masih memeriksa penyimpanan untuk mengonfirmasi bahwa setiap versi dokumen terlihat. Ini dapat terjadi ketika koleksi memiliki penulisan baru-baru ini yang versi dokumen usangnya pengumpulan sampah belum direklamasi. Setelah pengumpulan sampah memproses dokumen-dokumen itu, docsExamined turun ke0. Pada titik itu, kueri menyadari manfaat penuh dari pemindaian yang tercakup. Untuk informasi lebih lanjut tentang pengumpulan sampah, lihatPengumpulan sampah di Amazon DocumentDB. Untuk informasi selengkapnya tentang docsExamined metrik, lihatAnalisis rencana kueri.
Praktik terbaik
-
Rancang indeks gabungan yang berisi bidang yang paling sering diproyeksikan atau grup kueri Anda, sehingga kueri tersebut dapat dibahas.
-
Kecualikan
_iddarifindproyeksi ({ _id: 0, ... }) kecuali_idmerupakan bagian dari indeks penutup. -
Hindari pengindeksan bidang array (multikey) saat Anda ingin kueri dibahas, karena kolom multikey mendiskualifikasi jalur indeks saja.
-
Izinkan pengumpulan sampah mengikuti beban kerja penulisan Anda sehingga pemindaian yang tercakup melewatkan akses dokumen dan
docsExaminedtetap ada0. Lihat informasi yang lebih lengkap di Pengumpulan sampah di Amazon DocumentDB.