MongoDB / Index

Index

Index нь MongoDB-д query-ийн хурдыг эрс нэмэгдүүлдэг бүтэц юм. Index байхгүй үед MongoDB шүүлтэд тохирох document-уудыг олохын тулд бүх collection-ийг уншдаг — үүнийг collection scan гэнэ. Их хэмжээний өгөгдөлд энэ нь маш удаан болдог.

Index гэж яг юу вэ?

Номын ард байдаг хичээлийн индекс-тэй адил зарчим: "MongoDB" гэсэн үгийг хайхад бүх хуудас нэг нэгээр үзэхийн оронд индексийн хуудсаас шууд хуудасны дугаарыг олно.

MongoDB-д _id талбар дээр анхдагч index автоматаар үүсдэг.

createIndex

javascript
// Хэлбэр:
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-үүдийг харах

javascript
db.users.getIndexes();

// Үр дүн:
// [
//   { key: { _id: 1 }, name: "_id_" },              ← автомат
//   { key: { email: 1 }, name: "email_1" }           ← өөрийн
// ]

dropIndex — index устгах

javascript
// Нэрээр устгах
db.users.dropIndex("email_1");

// Талбараар устгах
db.users.dropIndex({ email: 1 });

Compound index — олон талбарын index

Нэгэн зэрэг хэд хэдэн талбараар шүүдэг query-д compound index тохиромжтой.

javascript
// city ба age-ийн хамтарсан index
db.users.createIndex({ city: 1, age: -1 });

Compound index нь зүүн талаасаа ажилладаг — { city, age } index нь city дангаараа буюу city + age хоёуланд ажилладаг, гэхдээ age дангаараа шүүхэд ашиглагдахгүй.

javascript
// ✅ Index ашиглана
db.users.find({ city: "Улаанбаатар" });
db.users.find({ city: "Улаанбаатар", age: { $gt: 18 } });

// ❌ Index ашиглахгүй (зүүн талын талбар алга)
db.users.find({ age: { $gt: 18 } });

Unique index

Давхардсан утга хориглох index:

javascript
// email давхардахгүй байхыг баталгаажуулах
db.users.createIndex({ email: 1 }, { unique: true });

Давхардсан утгатай document оруулах гэвэл MongoDB алдаа өгнө.

TTL index — автомат хугацаа дуусах

TTL (Time-To-Live) index нь тодорхой хугацааны дараа document-уудыг автоматаар устгадаг. Session, log, кэш мэдээлэлд тохиромжтой.

javascript
// createdAt талбараас 86400 секунд (24 цаг) өнгөрсний дараа устгах
db.sessions.createIndex({ createdAt: 1 }, { expireAfterSeconds: 86400 });

createdAt нь Date төрлийн байх ёстой. MongoDB дэвсгэр ажилчин (background worker) 60 секунд тутам хугацаа дуусах document-уудыг шалгаж устгадаг.

explain() — query-ийн гүйцэтгэлийг шалгах

explain() нь MongoDB query-ийг хэрхэн гүйцэтгэж байгааг харуулдаг — index ашиглаж байгаа эсэхийг баталгаажуулахад хэрэглэнэ.

javascript
db.users.find({ email: "bold@example.com" }).explain("executionStats");

Гол үзүүлэлтүүд:

javascript
{
  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, count query-уудыг эрс хурдасгана
  • Их хэмжээний өгөгдөлд зайлшгүй шаардлагатай

Сул тал:

  • insert, update, delete хийх бүрт index-үүд шинэчлэгдэх тул бага зэрэг удаашрана
  • Disk болон RAM ашиглана

Байнга шүүдэг, эрэмбэлдэг талбаруудад index үүсгэх нь зөв. Ховор ашиглагдах талбарт index хийх шаардлагагүй.

Дараагийн хичээлд:

Aggregation Pipeline ашиглан өгөгдлийг дүгнэх, нэгтгэх талаар үзнэ.