NahdaAIنهضة
NoSQL Databases • المستوى الرابع • الدرس 1

الفهارس وتحسين الأداء (Single & Compound Indexes)

العودة لفهرس المستوى

أهداف الدرس العلمية

  • إنشاء الفهارس الفردية والمركبة بـ createIndex لتسريع الاستعلامات.
  • تطبيق قيد الفرادة { unique: true } لحماية صحة البيانات.
  • فهم ترتيب الحقول في الفهرس المركب (Compound Index Order).
  • إدارة الفهارس: getIndexes و dropIndex.

1. لماذا الفهارس مهمة؟

بدون فهارس، يجبر MongoDB السيرفر على مسح كل المستندات (Collection Scan). الفهرس يبني هيكل B-Tree يقلل زمن الاستجابة من مللي ثوانٍ إلى ميكروثانية.

بدون فهرس
db.users.find({ email: "..." })
// O(n) — يقرأ كل المستندات
مع فهرس
db.users.createIndex({ email: 1 })
// O(log n) — قفزة مباشرة

2. إنشاء الفهارس — createIndex()

javascript
// فهرس فردي تصاعدي (1 = تصاعدي، -1 = تنازلي)
db.users.createIndex({ email: 1 });

// فهرس فريد (يمنع التكرار)
db.users.createIndex({ email: 1 }, { unique: true });

// فهرس مركب (Compound Index)
db.orders.createIndex({ category: 1, createdAt: -1 });

// فهرس باسم مخصص
db.users.createIndex({ name: 1 }, { name: "name_lookup" });
قاعدة ذهبية — ESR Rule

في الفهارس المركبة، رتّب الحقول حسب:
• Equality (المساواة) → أولاً
• Sort (الترتيب) → ثانياً
• Range (المدى) → أخيراً

3. إدارة الفهارس — getIndexes() و dropIndex()

javascript
// عرض جميع الفهارس على مجموعة
db.users.getIndexes();
// النتيجة:
// [
//   { v: 2, key: { _id: 1 }, name: "_id_" },
//   { v: 2, key: { email: 1 }, name: "email_1", unique: true },
//   { v: 2, key: { age: 1 },   name: "age_1" }
// ]

// حذف فهرس باسمه
db.users.dropIndex("age_1");

4. متى تنشئ فهرس (ومتى لا)

أنشئ فهرساً إذا:
  • • الحقل يُستخدم في find() بكثرة
  • • الحقل يُستخدم في sort()
  • • الحقل يحتاج قيد unique
  • • الحقل يُستخدم في $lookup
لا تُفرط في الفهارس:
  • • كل فهرس يُبطئ insert
  • • يستهلك مساحة تخزين إضافية
  • • لا تُفهرس الحقول صغيرة التنوع
  • • فهارس قليلة الاستخدام = عبء على الأداء
التطبيق العملي المباشر

تحدي الدرس الأول: إدارة الفهارس

قم بالتعديل على الكود بداخل المحرر أدناه لتطبيق المتطلبات التالية:

  1. أنشئ فهرساً فريداً على حقل email.
  2. أنشئ فهرساً فردياً على حقل age.
  3. أنشئ فهرساً مركّباً على country + age.
  4. اختبر الفرادة بمحاولة إدراج بريد مكرر.
  5. احذف فهرس age_1 وأعد عرض الفهارس.
⏳ جارٍ تحميل المحرر التفاعلي...