يقدم هذا الفصل مقدمة في تحليل أداء استعلامات MongoDB، وبشكل مشابه لـ SQL's explain، تدعم MongoDB أيضًا explain لتحليل أداء بيانات الاستعلام.
الاستخدام الأساسي
من خلال استدعاء دالة explain، يمكنك الحصول على نتيجة التحليل
// نتيجة التحليل لطريقة البحث
db.collection.find({}).explain();
// نتيجة التحليل لطريقة التجميع
db.collection.explain().aggregate([]);
explain لديه ثلاث وسائط:
- queryPlanner (الافتراضي)
- executionStats
- allPlansExecution
الشرح:
- باستخدام queryPlanner، يتم سرد جميع الخطط التنفيذية المحتملة فقط، ولا يقوم بتنفيذ البيان الفعلي، ويعرض الخطة الفائزة winningPlan التي فازت بالفعل.
- باستخدام executionStats، يقوم بتنفيذ الخطة الفائزة فقط ويخرج النتيجة.
- باستخدام allPlansExecution، يقوم بتنفيذ جميع الخطط ويخرج النتائج.
استخدام وسائط مختلفة
// وضع executionStats، ما عليك سوى تمرير المعلمات إلى دالة explain
db.collection.find({}).explain('executionStats');
// وضع allPlansExecution
db.collection.find({}).explain('allPlansExecution');
شرح محتوى explain
محتوى queryPlanner
يعتبر المحتوى التالي هو المحتوى الافتراضي المُرجع بواسطة explain، ويتجاهل المعلومات غير المهمة
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "test.orders",
"indexFilterSet" : false, // مقياس مهم، ما إذا كان استخدام تصفية الفهرس للبيانات
"winningPlan" : {
"stage" : "COLLSCAN", // مقياس مهم، اسم مرحلة البد التنفيذية. لكل مرحلة معلومات محددة للمرحلة، مثلا، COLLSCAN يمثل مسح محتوى الجدول بأكمله
"direction" : "forward"
},
"rejectedPlans" : [ ]
}
...
}
أنواع مراحل المراحل النهائية هي كما يلي:
- COLLSCAN: مسح الجدول بأكمله
- IXSCAN: مسح الفهرس
- FETCH: الحصول على وثائق محددة بناءً على الفهرس
- SHARD_MERGE: دمج البيانات المُرجعة من كل شارد
- SORT: يشير إلى الفرز في الذاكرة
- LIMIT: تحديد عدد الإرجاعات
- SKIP: تخطي الاستخدام
- IDHACK: الاستعلام عن _id
- SHARDING_FILTER: الاستفسار عن البيانات المجزأة من خلال مونجوس
- COUNT: عمليات العد تستخدم db.coll.explain().count() أو ما شابه
- COUNTSCAN: المرحلة المُرجعة عندما لا تستخدم عملية العد فهرسًا للعد
- COUNT_SCAN: المرحلة المُرجعة عند استخدام عملية العد فهرسًا للعد
- SUBPLA: المرحلة المُرجعة للاستعلامات $or التي لا تستخدم الفهارس
- TEXT: المرحلة المرجعة عند الاستعلام باستخدام فهارس النص الكامل
- PROJECTION: المرحلة المرجعة لتحديد حقول الإرجاع
محتوى executionStats
المحتوى التالي هو المحتوى المُرجَع في وضع executionStats، ويتجاهل المعلومات غير المهمة
{
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 5, // عدد الوثائق المرجعة
"executionTimeMillis" : 0, // وقت التنفيذ
"totalKeysExamined" : 0, // عدد مفاتيح التي تم فحصها
"totalDocsExamined" : 5, // العدد الكلي للوثائق التي تم فحصها
"executionStages" : {
"stage" : "COLLS CAN", // نوع المرحلة، COLLSCAN تعني مسح الجدول بأكمله
"nReturned" : 5,
"executionTimeMillisEstimate" : 0,
"works" : 7,
"advanced" : 5,
"needTime" : 1,
"needYield" : 0,
"saveState" : 0,
"restoreState" : 0,
"isEOF" : 1,
"direction" : "forward",
"docsExamined" : 5
}
}
}
أفكار تحسين الاستعلامات
- استخدام الفهارس قدر الإمكان
- كلما انخفض عدد الوثائق المفحوصة كلما كان ذلك أفضل