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 - • يستهلك مساحة تخزين إضافية
- • لا تُفهرس الحقول صغيرة التنوع
- • فهارس قليلة الاستخدام = عبء على الأداء
التطبيق العملي المباشر
تحدي الدرس الأول: إدارة الفهارس
قم بالتعديل على الكود بداخل المحرر أدناه لتطبيق المتطلبات التالية:
- أنشئ فهرساً فريداً على حقل
email. - أنشئ فهرساً فردياً على حقل
age. - أنشئ فهرساً مركّباً على
country+age. - اختبر الفرادة بمحاولة إدراج بريد مكرر.
- احذف فهرس
age_1وأعد عرض الفهارس.
⏳ جارٍ تحميل المحرر التفاعلي...