برای عیبیابی پُرسمانهای کند، از توضیح پُرسمان استفاده کنید تا طرح اجرای پُرسمان و نمایه اجرای زمان اجرا را دریافت کنید. بخش زیر مراحلی را شرح میدهد که میتوانید برای بهینهسازی عملکرد پُرسمان بسته به نمایه اجرا انجام دهید:
محدود کردن تعداد نتایج
از فیلد سوابق برگرداندهشده در درخت اجرا استفاده کنید تا ببینید آیا پُرسمان
اسناد زیادی را برمیگرداند یا نه. تعداد اسناد برگرداندهشده را بااستفاده از عبارت $limit محدود کنید. این کار اندازه بایت سریالیشده نتایج را
هنگام بازگشت به مشتریان ازطریق شبکه کاهش میدهد. در مواردی که گره Limit
با گره MajorSort پیشروی میکند، موتور پُرسمان میتواند گرههای Limit
و MajorSort را ادغام کند و تحقق کامل درونحافظهای و
مرتبسازی را با مرتبسازی TopN جایگزین کند، که این امر نیاز حافظه برای پُرسمان را کاهش میدهد.
محدود کردن اندازه سند نتیجه
برای جلوگیری از واکشی فیلدهای غیرضروری، اندازه سند برگرداندهشده را بااستفاده از عبارت $project محدود کنید. این کار به کاهش هزینه محاسباتی و حافظه پردازش نتایج میانی و اندازه بایت سریالیشده نتایج هنگام بازگشت به مشتریان ازطریق شبکه کمک میکند. در مواردی که همه فیلدهای ارجاعشده در پُرسمان تحت پوشش نمایه معمولی (نه چندکلیدی) قرار میگیرند، این امر همچنین اجازه میدهد پُرسمان بهطور کامل تحت پوشش اسکن نمایه قرار گیرد و از نیاز به واکشی اسناد از فضای ذخیرهسازی اصلی جلوگیری میکند.
استفاده از نمایهها
برای راهاندازی و بهینهسازی نمایهها، از دستورالعملهای زیر استفاده کنید.
تشخیص اینکه آیا پُرسمان از نمایه استفاده میکند یا نه
با بررسی گرههای برگ در درخت اجرا میتوانید تشخیص دهید که پُرسمان از نمایه استفاده میکند یا نه. اگر گره برگ درخت اجرا یک گره TableScan باشد، یعنی پُرسمان از نمایه استفاده نمیکند و درحال اسکن کردن اسناد از فضای ذخیرهسازی اصلی است. اگر از نمایهای استفاده شود، گره برگ درخت اجرا شناسه نمایه و فیلدهای نمایه را نمایش خواهد داد.
تشخیص اینکه آیا نمایه استفادهشده قابل بهینهسازی است یا نه
نمایه زمانی برای پُرسمان مفید است که بتواند تعداد اسنادی را که موتور پُرسمان باید از فضای ذخیرهسازی اصلی واکشی کند کاهش دهد یا اگر ترتیب فیلد آن بتواند نیاز «مرتبسازی» پُرسمان را برآورده کند.
اگر از نمایهای برای پُرسمان استفاده شود، اما موتور پُرسمان همچنان درحال واکشی و دور انداختن اسناد زیادی باشد، همانطور که توسط گره «اسکن» که رکوردهای زیادی را برمیگرداند و بهدنبال آن گره «فیلتر» که رکوردهای کمی را برمیگرداند شناسایی میشود، این نشانهای است که گزاره پُرسمان برآوردهشده بااستفاده از نمایه انتخابی نیست. برای ایجاد نمایهای مناسبتر، ایجاد نمایهها را ببینید.
اگر از نمایه غیرچندکلیدی برای پُرسمان استفاده شود، اما موتور پُرسمان همچنان درحال انجام مرتبسازی مجدد درونحافظهای مجموعه نتایج باشد، همانطور که توسط گره MajorSort در درخت اجرای پُرسمان شناسایی شده است، این نشانهای است که نمایه استفادهشده نمیتواند برای ارائه الزامات «مرتبسازی» پُرسمان استفاده شود. برای ایجاد نمایهای مناسبتر، بخش بعدی را ببینید.
درحال بهینهسازی $lookup پُرسمان
میتوانید پُرسمانهای $lookup را با افزودن نمایهها به مجموعه from بهینهسازی کنید
که به عملیات اجازه میدهد اسناد منطبق را بهطور کارآمد و بدون اسکن کردن
کل مجموعه پیدا کند.
$lookup با localField و foreignField
اگر از گزینههای localField و foreignField در مرحله $lookup استفاده میکنید، نمایهای در foreignField در مجموعه from ایجاد کنید.
$lookup با خطوط لوله تودرتو
اگر از گزینه pipeline در مرحله $lookup با مراحل $match استفاده میکنید، نمایهای در فیلدهای مربوط به مجموعه خارجی ایجاد کنید تا از اسکن کامل مجموعه جلوگیری شود:
- برای مراحل
$matchبا معناشناسی فیلتر (برای مثال{$match: {a: true}})، نمایهای در فیلدهای مربوط به مجموعه خارجی ایجاد کنید (a). - برای مراحل
$matchبا معناشناسی انبوهش که فیلدی را با مقدار ثابتی (برای مثال{$match: {$expr: {$gt: [a, 10]}}}) یا با مقایسههای برابری (eqیاin) بین فیلدها و متغیرهای تعریفشده درlet(برای مثال{$match: {$expr: {$eq: [a, "$$a"]}}}) مقایسه میکند، نمایهای روی فیلدهای درگیر در مجموعه خارجی ایجاد کنید. توجه داشته باشید که از نمایه چندکلیدی در برنامهریزی استفاده نخواهد شد.
ایجاد نمایهها
برای ایجاد نمایهها، اسناد مدیریت نمایه را دنبال کنید. برای اطمینان از اینکه پرسمانتان میتواند از نمایهها استفاده کند، نمایههای معمولی (نه چندکلیدی) با فیلدهایی به ترتیب زیر ایجاد کنید:
- همه فیلدهایی که در عملگرهای برابری استفاده خواهند شد. برای بهحداکثر رساندن احتمال استفاده مجدد در پُرسمانها، فیلدها را بهترتیب نزولی وقوع فیلدها در عملگرهای برابری بین پُرسمانها مرتب کنید.
- همه فیلدهایی که براساس آنها مرتبسازی انجام خواهد شد (به همان ترتیب).
- فیلدهایی که در اپراتورهای محدوده یا نابرابری بهترتیب نزولی انتخابپذیری محدودیت پُرسمان استفاده خواهند شد.
- فیلدهایی که بهعنوان بخشی از پُرسمان در نمایه برگردانده میشوند: گنجاندن چنین فیلدهایی در نمایه به نمایه اجازه میدهد پُرسمان را پوشش دهد و از واکشی سند از فضای ذخیرهسازی اصلی جلوگیری کند.
برای پُرسمانهایی که شامل فیلتر کردن و مرتبسازی فیلدهای آرایه هستند، ایجاد نمایههای چندکلیدی را درنظر بگیرید.
استفاده از راهنمای پُرسمان
اگر نمایه مناسبتری برای پُرسمان ایجاد کردهاید اما موتور پُرسمان از آن نمایه استفاده نمیکند، میتوانید بااستفاده از راهنمایی پُرسمان، اولویت نمایه موتور پُرسمان را لغو کنید.
برای اطلاعات بیشتر درباره خروجی پُرسمان اجراشده با «توضیح پُرسمان»، به مرجع اجرای پُرسمان مراجعه کنید.