Persilangan Indeks berbanding Indeks Gubahan
Pelajar akan memahami masa MongoDB mempersilangkan berbilang indeks medan tunggal dan masa indeks gubahan mengatasi persilangan.
Persilangan Indeks berbanding Indeks Gubahan ialah pelajaran MongoDB Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran MongoDB Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus MongoDB Academy merangkumi sejumlah 4 pelajaran.
Apakah Persilangan Indeks?
Persilangan indeks ialah keupayaan MongoDB untuk menggunakan dua atau lebih indeks medan tunggal secara serentak bagi memenuhi satu pertanyaan. Daripada membina satu indeks gabungan yang meliputi semua medan penapis, MongoDB mengimbas beberapa indeks secara berasingan, kemudian mengambil persilangan ID dokumen yang sepadan. Kedengarannya mudah, tetapi dalam amalan ia jarang sepantas indeks gabungan yang direka dengan baik.
Cara Persilangan Indeks Berfungsi Secara Dalaman
Apabila MongoDB mempertimbangkan untuk menyilangkan indeks, perancang pertanyaan: 1) Mengimbas indeks A untuk dokumen yang sepadan dengan syarat 1 dan mengumpulkan ID rekodnya. 2) Mengimbas indeks B untuk dokumen yang sepadan dengan syarat 2. 3) Mengira persilangan kedua-dua set ID. 4) Mendapatkan dokumen sebenar menggunakan ID tersebut. Ini dipanggil tahap AND_SORTED atau AND_HASH dalam output explain().
// With two single-field indexes:
db.orders.createIndex({ status: 1 })
db.orders.createIndex({ customerId: 1 })
// Query may intersect both indexes
db.orders.find({ status: 'pending', customerId: 'c001' })
.explain('executionStats')
// Look for 'AND_SORTED' or 'AND_HASH' stage in winningPlanApabila MongoDB Memilih Persilangan
MongoDB hanya menggunakan persilangan indeks apabila perancang pertanyaannya mengira bahawa kaedah itu lebih murah berbanding pilihan lain. Perancang menjalankan sehingga 200 pelan calon secara selari (menggunakan pelaksanaan percubaan) dan memilih pelan dengan kos anggaran terendah. Persilangan lebih berkemungkinan dipilih apabila koleksi besar dan setiap indeks individu sangat terpilih — kedua-duanya mengecilkan set calon dengan ketara sebelum langkah persilangan.
// Check if MongoDB chose to intersect indexes
const plan = db.orders.find({
status: 'pending',
customerId: 'c001'
}).explain('executionStats')
// Intersection chosen:
print(JSON.stringify(plan.queryPlanner.winningPlan, null, 2))
// Look for: 'stage': 'AND_SORTED'Indeks Gabungan berbanding Persilangan: Perbezaan Utama
Indeks gabungan menyimpan kunci daripada beberapa medan dalam satu B-tree yang telah disusun. Pertanyaan pada medan tersebut melakukan satu imbasan indeks yang cekap dan mengembalikan dokumen dalam susunan tersusun. Persilangan indeks melakukan beberapa imbasan berasingan, kemudian menggabungkan hasil dalam memori. Langkah penggabungan menambah penggunaan CPU dan memori yang dapat dielakkan sepenuhnya oleh indeks gabungan.
// Compound index: one scan, sorted output
db.orders.createIndex({ status: 1, customerId: 1 })
// Single scan: fast, no in-memory merge
db.orders.find({ status: 'pending', customerId: 'c001' })
// explain(): IXSCAN stage only — no AND_SORTEDIndeks Gabungan Mengatasi Persilangan untuk Susunan
Persilangan indeks tidak dapat memenuhi susunan — set hasil yang digabungkan tidak mempunyai susunan tertentu berbanding kunci susunan, jadi MongoDB perlu melakukan tahap SORT dalam memori. Indeks gabungan yang merangkumi medan susunan menyampaikan hasil secara terus dalam susunan yang betul daripada indeks, lalu mengelakkan kos tambahan penyusunan sepenuhnya. Untuk pertanyaan yang menapis dan menyusun, indeks gabungan hampir sentiasa lebih baik.
// Index intersection + sort = in-memory sort required
db.orders.find({ status: 'pending', customerId: 'c001' })
.sort({ createdAt: 1 })
// Even if both status and customerId indexes intersect,
// MongoDB must still sort the merged result in memory
// Compound index avoids the sort stage
db.orders.createIndex({ status: 1, customerId: 1, createdAt: 1 })Apabila Persilangan Boleh Mengatasi Indeks Gabungan
Persilangan indeks kadangkala mengatasi indeks gabungan apabila: 1) Kedua-dua indeks individu sangat terpilih (setiap satu mengembalikan sangat sedikit dokumen). 2) Pertanyaan bersifat ad hoc — anda tidak dapat meramalkan medan yang akan ditapis bersama, jadi membina indeks gabungan untuk setiap gabungan adalah tidak praktikal. 3) Koleksi banyak melakukan penulisan — lebih sedikit indeks bermakna beban penulisan yang lebih rendah, jadi menggunakan persilangan daripada dua indeks sedia ada mengelakkan penambahan indeks ketiga.
Mengawal Perancang Pertanyaan Dengan hint()
Anda boleh memaksa MongoDB menggunakan indeks tertentu (atau strategi persilangan) dengan .hint(). Ini memintas pemilihan automatik oleh perancang pertanyaan dan berguna untuk penanda aras — anda boleh membandingkan statistik pelaksanaan indeks gabungan yang dipilih secara manual dengan tindakan perancang jika menggunakan indeks individu.
// Force a specific compound index
db.orders.find({ status: 'pending', customerId: 'c001' })
.hint({ status: 1, customerId: 1 })
.explain('executionStats')
// Force use of a single-field index (no intersection)
db.orders.find({ status: 'pending', customerId: 'c001' })
.hint({ status: 1 })
.explain('executionStats')Mengesan Persilangan dalam Output explain()
Apabila MongoDB menggunakan persilangan indeks, output explain() memaparkan tahap AND_SORTED atau AND_HASH sebagai induk kepada dua tahap IXSCAN. AND_SORTED digunakan apabila kedua-dua indeks mengembalikan hasil dalam susunan yang sama; AND_HASH membina cincangan dalam memori bagi satu set hasil dan menyemaknya dengan set yang lain. Kedua-duanya menandakan bahawa indeks gabungan yang dipilih dengan baik mungkin lebih pantas.
// Identify intersection usage
const plan = db.orders
.find({ status: 'pending', region: 'EU' })
.explain('executionStats')
// Check for AND_SORTED or AND_HASH
// If found, benchmark against a compound index { status:1, region:1 }Peraturan Umum: Utamakan Indeks Gabungan
Untuk corak pertanyaan yang diketahui dan berulang, indeks gabungan hampir sentiasa lebih pantas daripada bergantung pada persilangan. Satu-satunya sebab untuk mengutamakan persilangan ialah pertanyaan terlalu tidak menentu untuk diliputi oleh indeks gabungan, atau kadar penulisan terlalu tinggi sehingga penambahan indeks menjadi terlalu mahal. Dalam keadaan tersebut, kekalkan indeks individu seminimum mungkin dan biarkan perancang melakukan persilangan apabila ia membantu.
Audit Indeks: Mengalih Keluar Indeks Berlebihan
Apabila aplikasi berkembang, pembangun menambah indeks secara reaktif. Lama-kelamaan, koleksi mengumpulkan indeks berlebihan yang memperlahankan penulisan tanpa memberikan manfaat kepada pembacaan. Semak secara berkala menggunakan $indexStats: mana-mana indeks dengan accesses.ops bernilai sifar dalam tempoh yang panjang tidak digunakan dan boleh digugurkan. Cari juga indeks yang menjadi berlebihan disebabkan peraturan awalan indeks gabungan.
// Identify unused indexes
db.orders.aggregate([{ $indexStats: {} }])
// { name: 'status_1', accesses: { ops: 0, since: ... } }
// If ops is 0 since a long time, the index is unused — drop it
db.orders.dropIndex('status_1')Panduan Praktikal: Rangka Kerja Membuat Keputusan
Gunakan rangka kerja ini: Corak pertanyaan diketahui dan berulang? → Bina indeks gabungan menggunakan ESR. Pertanyaan bersifat ad hoc atau sukar diramalkan? → Bergantung pada indeks individu dan terima kemungkinan berlakunya persilangan. Kadar penulisan kritikal? → Kurangkan jumlah indeks; alih keluar indeks yang tidak digunakan. Pertanyaan melibatkan susunan? → Sentiasa gunakan indeks gabungan; persilangan tidak pernah memenuhi susunan.
Semakan Pantas
Uji pemahaman anda tentang konsep MongoDB dan Pangkalan Data NoSQL daripada pelajaran ini.
Ringkasan Pelajaran
Dalam pelajaran ini, anda telah mempelajari: persilangan indeks menggunakan dua indeks satu medan dan menggabungkan hasilnya dalam memori, lalu menambah beban pemprosesan, indeks kompaun hampir selalu lebih pantas untuk corak pertanyaan yang diketahui dan berulang — terutamanya pertanyaan yang melibatkan pengisihan, dan gunakan $indexStats untuk mencari serta membuang indeks yang tidak digunakan atau berlebihan, yang memperlahankan operasi tulis. Seterusnya, kita akan meneroka petua pengoptimuman saluran agregasi.
Pelajari JavaScript dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 30
- Pelajaran
- 120
Soalan Lazim
Adakah pelajaran “Persilangan Indeks berbanding Indeks Gubahan” percuma?
Ya — teks penuh “Persilangan Indeks berbanding Indeks Gubahan” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus MongoDB Academy, tingkat taraf kepada CoddyKit PRO. Kursus MongoDB Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Persilangan Indeks berbanding Indeks Gubahan”?
Pelajar akan memahami masa MongoDB mempersilangkan berbilang indeks medan tunggal dan masa indeks gubahan mengatasi persilangan. Anda berlatih MongoDB Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan MongoDB Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran MongoDB Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.
Berapa lamakah pelajaran “Persilangan Indeks berbanding Indeks Gubahan” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran MongoDB Academy ini?
Ya. Setiap pelajaran MongoDB Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Pemprofil Pangkalan Data dan Log Pertanyaan Perlahan
- Peraturan Awalan Indeks Gubahan dan Prinsip ESR
- Persilangan Indeks berbanding Indeks Gubahan
- Petua Pengoptimuman Saluran Paip Agregasi