این فصل معرفی می‌کند که چطور می‌توانید عملکرد کوئری MongoDB را تحلیل کنید، مشابه SQL's explain، در MongoDB هم پشتیبانی از explain برای تحلیل عملکرد دستورات کوئری وجود دارد.

استفاده پایه

با فراخوانی تابع explain، می‌توانید نتیجه تحلیل را بدست آورید.

// نتیجه تحلیل متد find
db.collection.find({}).explain();

// نتیجه تحلیل متد aggregate
db.collection.explain().aggregate([]);

explain دارای سه حالت است:

  • queryPlanner (پیش‌فرض)
  • executionStats
  • allPlansExecution

توضیح:

  • استفاده از queryPlanner فقط تمامی برنامه‌های اجرای ممکن را فهرست می‌کند، اجرای واقعی دستور را انجام نمی‌دهد و برنامه برنده را که قبلاً برنده شده است نشان می‌دهد.
  • استفاده از 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: جستجوی داده‌های شارد از طریق mongos
  • 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
		}
	}
}

ایده‌های بهینه‌سازی کوئری

  • از ایندکس‌ها به حد امکان استفاده کنید
  • هر چه کمتر اسناد اسکن شود، بهتر است