Index
Index нь MongoDB-д query-ийн хурдыг эрс нэмэгдүүлдэг бүтэц юм. Index байхгүй үед MongoDB шүүлтэд тохирох document-уудыг олохын тулд бүх collection-ийг уншдаг — үүнийг collection scan гэнэ. Их хэмжээний өгөгдөлд энэ нь маш удаан болдог.
Index гэж яг юу вэ?
Номын ард байдаг хичээлийн индекс-тэй адил зарчим: "MongoDB" гэсэн үгийг хайхад бүх хуудас нэг нэгээр үзэхийн оронд индексийн хуудсаас шууд хуудасны дугаарыг олно.
MongoDB-д _id талбар дээр анхдагч index автоматаар үүсдэг.
createIndex
// Хэлбэр:
db.collection.createIndex({ талбар: 1 эсвэл -1 })
// 1 = өсөх, -1 = буурах (энгийн index-т ялгаа алга)
// email талбар дээр index үүсгэх
db.users.createIndex({ email: 1 })
// createdAt талбар дээр index (шинэ document-уудыг хурдан олоход)
db.posts.createIndex({ createdAt: -1 })
getIndexes — index-үүдийг харах
db.users.getIndexes();
// Үр дүн:
// [
// { key: { _id: 1 }, name: "_id_" }, ← автомат
// { key: { email: 1 }, name: "email_1" } ← өөрийн
// ]
dropIndex — index устгах
// Нэрээр устгах
db.users.dropIndex("email_1");
// Талбараар устгах
db.users.dropIndex({ email: 1 });
Compound index — олон талбарын index
Нэгэн зэрэг хэд хэдэн талбараар шүүдэг query-д compound index тохиромжтой.
// city ба age-ийн хамтарсан index
db.users.createIndex({ city: 1, age: -1 });
Compound index нь зүүн талаасаа ажилладаг — { city, age } index нь city дангаараа буюу city + age хоёуланд ажилладаг, гэхдээ age дангаараа шүүхэд ашиглагдахгүй.
// ✅ Index ашиглана
db.users.find({ city: "Улаанбаатар" });
db.users.find({ city: "Улаанбаатар", age: { $gt: 18 } });
// ❌ Index ашиглахгүй (зүүн талын талбар алга)
db.users.find({ age: { $gt: 18 } });
Unique index
Давхардсан утга хориглох index:
// email давхардахгүй байхыг баталгаажуулах
db.users.createIndex({ email: 1 }, { unique: true });
Давхардсан утгатай document оруулах гэвэл MongoDB алдаа өгнө.
TTL index — автомат хугацаа дуусах
TTL (Time-To-Live) index нь тодорхой хугацааны дараа document-уудыг автоматаар устгадаг. Session, log, кэш мэдээлэлд тохиромжтой.
// createdAt талбараас 86400 секунд (24 цаг) өнгөрсний дараа устгах
db.sessions.createIndex({ createdAt: 1 }, { expireAfterSeconds: 86400 });
createdAt нь Date төрлийн байх ёстой. MongoDB дэвсгэр ажилчин (background worker) 60 секунд тутам хугацаа дуусах document-уудыг шалгаж устгадаг.
explain() — query-ийн гүйцэтгэлийг шалгах
explain() нь MongoDB query-ийг хэрхэн гүйцэтгэж байгааг харуулдаг — index ашиглаж байгаа эсэхийг баталгаажуулахад хэрэглэнэ.
db.users.find({ email: "bold@example.com" }).explain("executionStats");
Гол үзүүлэлтүүд:
{
executionStats: {
nReturned: 1, // буцаасан document тоо
totalDocsExamined: 1, // уншсан document тоо
totalKeysExamined: 1, // шалгасан index оруулга
winningPlan: {
stage: "IXSCAN" // ← IXSCAN = index ашиглав (сайн)
// COLLSCAN = бүх collection уншив (муу)
}
}
}
IXSCAN харвал index ажиллаж байна. COLLSCAN харвал index алга эсвэл тохирохгүй байна гэсэн үг.
Index-ийн гүйцэтгэлд нөлөөлөх байдал
Index нь зөвхөн давуу тал биш — зарим анхааралтай байх зүйл байна:
Давуу тал:
find,sort,countquery-уудыг эрс хурдасгана- Их хэмжээний өгөгдөлд зайлшгүй шаардлагатай
Сул тал:
insert,update,deleteхийх бүрт index-үүд шинэчлэгдэх тул бага зэрэг удаашрана- Disk болон RAM ашиглана
Байнга шүүдэг, эрэмбэлдэг талбаруудад index үүсгэх нь зөв. Ховор ашиглагдах талбарт index хийх шаардлагагүй.
Дараагийн хичээлд:
Aggregation Pipeline ашиглан өгөгдлийг дүгнэх, нэгтгэх талаар үзнэ.