การสร้างดัชนีฟิลด์เดียวและดัชนีผสม
ผู้เรียนจะสร้างดัชนีฟิลด์เดียวและดัชนีผสม และสังเกตการเปลี่ยนแปลงของแผนการค้นหาด้วย explain('executionStats')
การสร้างดัชนีฟิลด์เดียวและดัชนีผสม เป็นบทเรียน MongoDB Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน MongoDB Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส MongoDB Academy มีบทเรียนทั้งหมด 4 บทเรียน
บางส่วนของบทเรียนนี้ยังไม่ได้รับการแปล และแสดงเป็นภาษาอังกฤษ
Single-Field Index Basics
A single-field index is the simplest index type: it tracks the values of exactly one document field in a sorted B-tree. You create one with db.collection.createIndex({ field: 1 }), where 1 means ascending order and -1 means descending. Single-field indexes are ideal for queries that filter or sort on just one field.
// 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' });Naming Your Indexes
MongoDB auto-generates an index name like email_1 or age_-1 from the field name and direction. You can override this with the name option to give meaningful labels to your indexes—especially helpful when managing many indexes in production or when the auto-generated name would exceed the 127-character limit imposed on compound indexes with many fields.
db.users.createIndex(
{ email: 1 },
{ name: 'idx_users_email' }
);
// List all indexes with their names
db.users.getIndexes();What Is a Compound Index?
A compound index tracks multiple fields together in a single B-tree. The entries are sorted first by the first field, then by the second field within each group of the first, and so on. This makes compound indexes far more selective and versatile than multiple single-field indexes for queries that filter or sort on several fields at once.
// 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 });The Prefix Rule for Compound Indexes
A compound index on { a, b, c } can serve queries on { a }, { a, b }, and { a, b, c }—these are called index prefixes. It cannot serve a query on just { b } or { c } alone because the B-tree is ordered by the first field first. Understanding the prefix rule helps you avoid creating redundant single-field indexes when a compound index already covers them.
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 COLLSCANCreating a Compound Index
You create a compound index by passing an object with multiple fields to createIndex. Field order matters: put equality fields first (fields filtered with $eq or exact values), then range fields, then sort fields. This arrangement ensures the index is used for both filtering and sorting in one traversal, following the ESR (Equality, Sort, Range) principle.
// 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 });Using explain() to See Index Usage
Always verify that your new index is actually being used with .explain('executionStats'). Look for winningPlan.stage: 'IXSCAN' to confirm index use, and check totalDocsExamined vs nReturned—a well-indexed query should examine roughly the same number of documents it returns.
const result = db.orders.find(
{ userId: 'u123' }
).explain('executionStats');
// Key fields to check:
// result.executionStats.executionStages.stage === 'IXSCAN'
// result.executionStats.totalDocsExamined
// result.executionStats.nReturnedBackground Index Builds
In MongoDB 4.2+, all index builds are non-blocking by default: they hold an exclusive lock only briefly at the start and end of the build, allowing reads and writes to continue during the lengthy build phase. On older versions you had to specify { background: true } explicitly. Building a large index can still consume significant CPU and I/O resources, so schedule builds during low-traffic periods in production.
// MongoDB 4.2+: non-blocking by default
db.bigCollection.createIndex({ category: 1 });
// Check ongoing index builds
db.currentOp({ 'command.createIndexes': { $exists: true } });Dropping Indexes
You can remove an index with db.collection.dropIndex(), passing either the index name or the key specification. Dropping unused indexes reduces write overhead and frees memory. The _id index cannot be dropped. Use dropIndexes() (plural) to drop all non-_id indexes at once—useful when rebuilding an index strategy from scratch.
// 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();Index Statistics With $indexStats
$indexStats is an aggregation stage that shows how many times each index has been used since the mongod process last started. An index with zero accesses is a prime candidate for removal. Combine this data with the index size from db.collection.stats() to build a complete cost/benefit picture for each index in your collection.
db.orders.aggregate([
{ $indexStats: {} },
{ $project: {
name: 1,
'accesses.ops': 1,
'accesses.since': 1
}}
]);Compound vs Multiple Single Indexes
Multiple single-field indexes can sometimes be combined via index intersection, but MongoDB's planner prefers compound indexes when they exist. A single well-designed compound index is almost always faster and more predictable than relying on the planner to intersect two separate indexes. Create compound indexes for your most frequent multi-field queries rather than hoping intersection will save you.
// 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 });The 64 Indexes Per Collection Limit
MongoDB allows a maximum of 64 indexes per collection. This is more than enough for well-designed schemas, but if you approach this limit, it is a strong signal that something is wrong—perhaps you have many redundant indexes or a table-like design that doesn't fit the document model. Audit your index usage regularly and prune indexes that have zero $indexStats accesses.
// 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 firstQuick Check
Test your understanding of single-field and compound indexes in MongoDB.
Lesson Recap
In this lesson you learned: single-field indexes track one field in a sorted B-tree and support equality, range, and sort queries, compound indexes track multiple fields and must be queried using their prefixes, and ESR ordering (Equality, Sort, Range) maximises compound index effectiveness. Next up we explore special index properties like unique, sparse, partial, and TTL.
เรียนรู้ JavaScript ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 30
- บทเรียน
- 120
คำถามที่พบบ่อย
บทเรียน “การสร้างดัชนีฟิลด์เดียวและดัชนีผสม” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การสร้างดัชนีฟิลด์เดียวและดัชนีผสม” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส MongoDB Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส MongoDB Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การสร้างดัชนีฟิลด์เดียวและดัชนีผสม”
ผู้เรียนจะสร้างดัชนีฟิลด์เดียวและดัชนีผสม และสังเกตการเปลี่ยนแปลงของแผนการค้นหาด้วย explain('executionStats') คุณปฏิบัติ MongoDB Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน MongoDB Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน MongoDB Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การสร้างดัชนีฟิลด์เดียวและดัชนีผสม” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน MongoDB Academy นี้ได้ไหม
ได้ บทเรียน MongoDB Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การทำงานของดัชนี B-Tree ใน MongoDB
- การสร้างดัชนีฟิลด์เดียวและดัชนีผสม
- คุณสมบัติดัชนี: ไม่ซ้ำ กระจายบางส่วน บางส่วน และ TTL
- การอ่านผลลัพธ์จาก explain() เพื่อวินิจฉัยการค้นหา