ما الذي يسبب بطء استعلامات 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 وثيقة | 850ms | 2ms |
| تجميع (Aggregation) | 3200ms | 45ms |
| Pagination (الصفحة 500) | 1200ms | 3ms |
خلاصة
تحسين أداء MongoDB ليس صعباً، لكنه يتطلب فهم كيفية عمل الفهارس وأنماط الاستعلام. باتباع هذه الممارسات ستلاحظ فرقاً كبيراً في سرعة تطبيقك.
هل تواجه مشكلة بطء في تطبيقك الحالي؟ تواصل معي لتحليل وحل مشكلة الأداء.