العودة إلى المدونة
MongoDBPerformanceNode.jsDatabaseOptimizationBackend

حل مشكلة بطء استعلامات MongoDB: دليل عملي لتحسين الأداء

How to Fix Slow MongoDB Queries: A Practical Performance Guide

ما الذي يسبب بطء استعلامات MongoDB؟

إذا لاحظت أن تطبيقك يتباطأ مع زيادة البيانات، فغالباً المشكلة في استعلامات MongoDB. إليك الأسباب الأكثر شيوعاً:

  • عدم وجود الفهارس (Indexes): كل استعلام بدون فهرس يسبب مسح كامل للمجموعة (Collection Scan).
  • استخدام $regex دون تهريب: يمنع استخدام الفهارس إذا كان يبدأ بـ ^ أو wildcard.
  • جلب بيانات أكثر من اللازم: استخدام find() بدون تحديد الحقول.
  • الـ N+1 Queries: استعلامات متكررة داخل حلقات (Loops).

كيف تشخص الاستعلامات البطيئة؟

MongoDB يوفر أدوات مدمجة لتشخيص الأداء:

// تفعيل Profiler لتتبع الاستعلامات البطيئة
db.setProfilingLevel(1, { slowms: 100 })

// عرض أحدث الاستعلامات البطيئة
db.system.profile.find().sort({ ts: -1 }).limit(5).pretty()

// شرح خطة تنفيذ استعلام (Explain)
db.collection.find({ name: "test" }).explain("executionStats")

حلول عملية لتسريع MongoDB

1. إضافة الفهارس المناسبة

أول وأهم خطوة لتسريع الاستعلامات:

// فهرس بسيط على حقل
db.users.createIndex({ email: 1 })

// فهرس مركب (Compound Index) للاستعلامات المتعددة الحقول
db.orders.createIndex({ userId: 1, createdAt: -1 })

// فهرس نصي (Text Index) للبحث في النصوص
db.posts.createIndex({ title: "text", content: "text" })

2. تحسين استعلامات البحث ($regex)

تأكد من تهريب (Escape) الرموز الخاصة لمنع NoSQL Injection وتحسين الأداء:

function escapeRegex(s) {
  return s.replace(/[.*+?^{}()|[]\\]/g, '\\$&');
}

// استخدم Prefix Regex للاستفادة من الفهارس
const safe = escapeRegex(search);
filter.name = { $regex: '^' + safe, $options: 'i' }

3. استخدام Pagination بدلاً من Skip

استخدام skip مع كميات كبيرة من البيانات يسبب بطء شديد. استخدم Range-based Pagination:

// بدلاً من:
db.users.find().skip(10000).limit(20)

// استخدم:
db.users.find({ _id: { $gt: lastId } }).limit(20).sort({ _id: 1 })

4. تحديد الحقول المطلوبة فقط

لا تجلب بيانات لا تحتاجها:

// بدلاً من:
db.users.find({ role: "admin" })

// استخدم:
db.users.find({ role: "admin" }, { name: 1, email: 1, _id: 1 })

مقارنة الأداء قبل وبعد التحسين

الاستعلامقبل التحسينبعد التحسين
بحث في 100,000 وثيقة850ms2ms
تجميع (Aggregation)3200ms45ms
Pagination (الصفحة 500)1200ms3ms

خلاصة

تحسين أداء MongoDB ليس صعباً، لكنه يتطلب فهم كيفية عمل الفهارس وأنماط الاستعلام. باتباع هذه الممارسات ستلاحظ فرقاً كبيراً في سرعة تطبيقك.

هل تواجه مشكلة بطء في تطبيقك الحالي؟ تواصل معي لتحليل وحل مشكلة الأداء.

عن الكاتب

Abdallah Dev

مطور ويب متكامل شغوف ببناء تطبيقات ويب حديثة ومشاركة المعرفة.

هل تريد تحسين موقعك أو بناء مشروع جديد؟

دعنا نناقش مشروعك ونجد الحل المناسب لاحتياجاتك. احصل على استشارة مجانية الآن.

احصل على استشارة مجانية