Mencipta Indeks Medan Tunggal dan Indeks Gubahan
Pelajar akan membina indeks medan tunggal dan indeks gubahan serta memerhatikan perubahan pelan pertanyaan dengan explain('executionStats').
Mencipta Indeks Medan Tunggal dan Indeks Gubahan ialah pelajaran MongoDB Academy percuma di CoddyKit. Ini ialah pelajaran 2 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.
Asas Indeks Satu Medan
Indeks satu medan ialah jenis indeks paling ringkas: indeks ini menjejaki nilai tepat satu medan dokumen dalam B-tree yang diisih. Anda menciptanya dengan db.collection.createIndex({ field: 1 }), dengan 1 bermaksud susunan menaik dan -1 bermaksud susunan menurun. Indeks satu medan sesuai untuk pertanyaan yang menapis atau mengisih berdasarkan satu medan sahaja.
// Create a single-field ascending index on 'email'
db.users.createIndex({ email: 1 });
// This query now hits the index instead of scanning every document
db.users.find({ email: 'alice@example.com' });Menamakan Indeks Anda
MongoDB menjana nama indeks secara automatik, seperti email_1 atau age_-1, daripada nama dan arah medan. Anda boleh menggantikannya dengan pilihan name untuk memberikan label yang bermakna kepada indeks Anda—terutamanya berguna apabila menguruskan banyak indeks dalam pengeluaran atau apabila nama yang dijana secara automatik melebihi had 127 aksara yang dikenakan pada indeks gabungan dengan banyak medan.
db.users.createIndex(
{ email: 1 },
{ name: 'idx_users_email' }
);
// List all indexes with their names
db.users.getIndexes();Apakah Indeks Gabungan?
Indeks gabungan menjejaki berbilang medan secara bersama dalam satu B-tree. Entri diisih terlebih dahulu berdasarkan medan pertama, kemudian berdasarkan medan kedua dalam setiap kumpulan medan pertama, dan seterusnya. Ini menjadikan indeks gabungan jauh lebih selektif dan serba guna berbanding berbilang indeks satu medan untuk pertanyaan yang menapis atau mengisih beberapa medan serentak.
// Compound index on lastName (asc) then firstName (asc)
db.users.createIndex({ lastName: 1, firstName: 1 });
// This single index satisfies all three queries efficiently:
db.users.find({ lastName: 'Smith' });
db.users.find({ lastName: 'Smith', firstName: 'John' });
db.users.find({}).sort({ lastName: 1, firstName: 1 });Peraturan Awalan untuk Indeks Gabungan
Indeks gabungan pada { a, b, c } boleh menyokong pertanyaan pada { a }, { a, b } dan { a, b, c }—semuanya dipanggil awalan indeks. Indeks ini tidak boleh menyokong pertanyaan pada { b } atau { c } sahaja kerana B-tree disusun berdasarkan medan pertama terlebih dahulu. Memahami peraturan awalan membantu Anda mengelakkan penciptaan indeks satu medan yang berlebihan apabila indeks gabungan sudah meliputinya.
db.orders.createIndex({ userId: 1, status: 1, createdAt: -1 });
// Supported by the compound index (prefixes):
db.orders.find({ userId: 'u1' });
db.orders.find({ userId: 'u1', status: 'pending' });
db.orders.find({ userId: 'u1', status: 'pending' }).sort({ createdAt: -1 });
// NOT supported - skips the first key
db.orders.find({ status: 'pending' }); // still does COLLSCANMencipta Indeks Gabungan
Anda mencipta indeks gabungan dengan menghantar objek yang mengandungi berbilang medan kepada createIndex. Susunan medan penting: letakkan medan kesamaan dahulu (medan yang ditapis dengan $eq atau nilai tepat), kemudian medan julat dan seterusnya medan pengisihan. Susunan ini memastikan indeks digunakan untuk penapisan dan pengisihan dalam satu laluan, mengikut prinsip ESR (Kesamaan, Pengisihan, Julat).
// Orders queried by userId (equality), sorted by date (sort),
// then filtered by amount (range)
// ESR order: userId -> createdAt -> amount
db.orders.createIndex({ userId: 1, createdAt: -1, amount: 1 });
// Perfectly served by this index:
db.orders
.find({ userId: 'u123', amount: { $gt: 100 } })
.sort({ createdAt: -1 });Menggunakan explain() untuk Melihat Penggunaan Indeks
Sentiasa sahkan bahawa indeks baharu Anda benar-benar digunakan dengan .explain('executionStats'). Cari winningPlan.stage: 'IXSCAN' untuk mengesahkan penggunaan indeks, dan semak totalDocsExamined berbanding nReturned—pertanyaan yang diindekskan dengan baik sepatutnya memeriksa kira-kira bilangan dokumen yang sama seperti yang dipulangkannya.
const result = db.orders.find(
{ userId: 'u123' }
).explain('executionStats');
// Key fields to check:
// result.executionStats.executionStages.stage === 'IXSCAN'
// result.executionStats.totalDocsExamined
// result.executionStats.nReturnedPembinaan Indeks di Latar Belakang
Dalam MongoDB 4.2 ke atas, semua pembinaan indeks adalah tidak menyekat secara lalai: kunci eksklusif hanya dipegang seketika pada permulaan dan penghujung pembinaan, membolehkan bacaan dan penulisan diteruskan sepanjang fasa pembinaan yang panjang. Dalam versi lama, anda perlu menyatakan { background: true } secara eksplisit. Pembinaan indeks besar masih boleh menggunakan sumber CPU dan I/O yang banyak, jadi jadualkan pembinaan ketika tempoh trafik rendah dalam persekitaran pengeluaran.
// MongoDB 4.2+: non-blocking by default
db.bigCollection.createIndex({ category: 1 });
// Check ongoing index builds
db.currentOp({ 'command.createIndexes': { $exists: true } });Menggugurkan Indeks
Anda boleh mengalih keluar indeks dengan db.collection.dropIndex(), dengan menghantar sama ada nama indeks atau spesifikasi kunci. Menggugurkan indeks yang tidak digunakan mengurangkan beban penulisan dan membebaskan memori. Indeks _id tidak boleh digugurkan. Gunakan dropIndexes() (bentuk jamak) untuk menggugurkan semua indeks bukan-_id sekali gus—berguna apabila anda membina semula strategi indeks dari awal.
// Drop by name
db.users.dropIndex('idx_users_email');
// Drop by key pattern
db.users.dropIndex({ email: 1 });
// Drop all except _id
db.users.dropIndexes();
// List remaining indexes
db.users.getIndexes();Statistik Indeks Dengan $indexStats
$indexStats ialah tahap pengagregatan yang menunjukkan berapa kali setiap indeks telah digunakan sejak proses mongod dimulakan kali terakhir. Indeks dengan sifar capaian ialah calon utama untuk dialih keluar. Gabungkan data ini dengan saiz indeks daripada db.collection.stats() untuk mendapatkan gambaran kos/faedah yang lengkap bagi setiap indeks dalam koleksi anda.
db.orders.aggregate([
{ $indexStats: {} },
{ $project: {
name: 1,
'accesses.ops': 1,
'accesses.since': 1
}}
]);Indeks Gubahan berbanding Berbilang Indeks Tunggal
Berbilang indeks medan tunggal kadangkala boleh digabungkan melalui persilangan indeks, tetapi perancang MongoDB lebih mengutamakan indeks gubahan apabila indeks tersebut tersedia. Satu indeks gubahan yang direka dengan baik hampir selalu lebih pantas dan lebih boleh dijangka berbanding bergantung pada perancang untuk bersilang antara dua indeks berasingan. Cipta indeks gubahan untuk kueri berbilang medan yang paling kerap anda gunakan, bukannya berharap persilangan akan membantu anda.
// Less ideal: two separate indexes
db.products.createIndex({ category: 1 });
db.products.createIndex({ price: 1 });
// Better: one compound index for the common query pattern
db.products.createIndex({ category: 1, price: 1 });Had 64 Indeks bagi Setiap Koleksi
MongoDB membenarkan maksimum 64 indeks bagi setiap koleksi. Jumlah ini lebih daripada mencukupi untuk skema yang direka dengan baik, tetapi jika anda menghampiri had ini, itu ialah petanda kukuh bahawa terdapat sesuatu yang tidak kena—mungkin anda mempunyai banyak indeks berlebihan atau reka bentuk seperti jadual yang tidak sesuai dengan model dokumen. Audit penggunaan indeks anda secara berkala dan pangkas indeks yang mempunyai sifar capaian $indexStats.
// See how many indexes your collection has
const indexes = db.myCollection.getIndexes();
console.log('Index count:', indexes.length);
// Hard limit: 64 indexes per collection
// Approaching it? Audit with $indexStats firstSemakan Pantas
Uji pemahaman anda tentang indeks medan tunggal dan indeks gubahan dalam MongoDB.
Rumusan Pelajaran
Dalam pelajaran ini, anda telah mempelajari bahawa: indeks medan tunggal menjejaki satu medan dalam B-tree tersusun serta menyokong kueri kesamaan, julat dan isihan; indeks gubahan menjejaki berbilang medan dan mesti dibuat kueri menggunakan awalan indeksnya; dan susunan ESR (Kesamaan, Isihan, Julat) memaksimumkan keberkesanan indeks gubahan. Seterusnya, kita akan meneroka sifat indeks khas seperti unik, jarang, separa dan TTL.
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 “Mencipta Indeks Medan Tunggal dan Indeks Gubahan” percuma?
Ya — teks penuh “Mencipta Indeks Medan Tunggal dan 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 “Mencipta Indeks Medan Tunggal dan Indeks Gubahan”?
Pelajar akan membina indeks medan tunggal dan indeks gubahan serta memerhatikan perubahan pelan pertanyaan dengan explain('executionStats'). 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 2 daripada 4.
Berapa lamakah pelajaran “Mencipta Indeks Medan Tunggal dan 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
- Cara Indeks B-Tree MongoDB Berfungsi
- Mencipta Indeks Medan Tunggal dan Indeks Gubahan
- Sifat Indeks: Unik, Jarang, Separa, TTL
- Membaca Output explain() untuk Mendiagnosis Pertanyaan