برای عیبیابی کوئریهای کند، از Query Explain برای به دست آوردن طرح اجرای کوئری و پروفایل اجرای زمان اجرا استفاده کنید. بخش زیر مراحلی را که میتوانید برای بهینهسازی عملکرد کوئری بسته به پروفایل اجرا انجام دهید، شرح میدهد:
محدود کردن تعداد نتایج
از فیلد رکوردهای برگردانده شده در درخت اجرا برای شناسایی اینکه آیا پرسوجو اسناد زیادی را برمیگرداند یا خیر، استفاده کنید. محدود کردن تعداد اسناد برگردانده شده با استفاده از عبارت $limit را در نظر بگیرید. این کار اندازه بایت سریالی شده نتایج را هنگام بازگشت به کلاینتها از طریق شبکه کاهش میدهد. در مواردی که گره Limit قبل از یک گره MajorSort قرار دارد، موتور پرسوجو میتواند گرههای Limit و MajorSort را با هم ادغام کند و یک مرتبسازی و تحقق کامل در حافظه را با یک مرتبسازی TopN جایگزین کند و نیاز حافظه برای پرسوجو را کاهش دهد.
محدود کردن اندازه سند نتیجه
محدود کردن اندازه سند برگردانده شده با استفاده از عبارت $project را در نظر بگیرید تا از واکشی فیلدهای غیرضروری جلوگیری شود. این کار به کاهش هزینه محاسباتی و حافظهای پردازش نتایج میانی و اندازه بایت سریالی شده نتایج هنگام بازگشت به کلاینتها از طریق شبکه کمک میکند. در مواردی که تمام فیلدهای ارجاع شده در پرسوجو توسط یک شاخص معمولی (نه چندکلیدی) پوشش داده میشوند، این امر همچنین به پرسوجو اجازه میدهد تا به طور کامل توسط اسکن شاخص پوشش داده شود و از نیاز به واکشی اسناد از حافظه اصلی جلوگیری شود.
استفاده از شاخصها
برای تنظیم و بهینهسازی ایندکسها از دستورالعملهای زیر استفاده کنید.
تشخیص اینکه آیا پرسوجو از یک شاخص استفاده میکند یا خیر
شما میتوانید با بررسی گرههای برگ در درخت اجرا، تشخیص دهید که آیا پرسوجو از ایندکس استفاده میکند یا خیر. اگر گره برگ درخت اجرا، گره TableScan باشد، به این معنی است که پرسوجو از ایندکس استفاده نمیکند و اسناد را از حافظه اصلی اسکن میکند. اگر از ایندکس استفاده شود، گره برگ درخت اجرا، شناسه ایندکس و فیلدهای ایندکس ایندکس را نمایش میدهد.
مشخص کنید که آیا شاخص مورد استفاده میتواند بهینه شود یا خیر
یک شاخص برای یک پرسوجو مفید است اگر بتواند تعداد اسنادی را که موتور پرسوجو باید از حافظه اصلی دریافت کند کاهش دهد یا اگر مرتبسازی فیلدهای آن بتواند الزام مرتبسازی پرسوجو را برآورده کند.
اگر از یک شاخص برای یک پرسوجو استفاده شود، اما موتور پرسوجو همچنان اسناد زیادی را دریافت و حذف کند، همانطور که توسط یک گره اسکن که رکوردهای زیادی را برمیگرداند و به دنبال آن یک گره فیلتر که رکوردهای کمی را برمیگرداند، مشخص میشود، این نشانهای است که گزاره پرسوجوی برآورده شده با استفاده از شاخص، گزینشی نیست. برای ایجاد یک شاخص مناسبتر، به ایجاد شاخصها مراجعه کنید.
اگر از یک شاخص غیر چندکلیدی برای یک پرسوجو استفاده شود، اما موتور پرسوجو همچنان در حال انجام مرتبسازی مجدد درون حافظهای مجموعه نتایج باشد، همانطور که توسط یک گره MajorSort در درخت اجرای پرسوجو مشخص میشود، این نشانهای است که شاخص مورد استفاده نمیتواند برای ارائه الزام مرتبسازی پرسوجو استفاده شود. برای ایجاد یک شاخص مناسبتر، به بخش بعدی مراجعه کنید.
بهینهسازی کوئریهای $lookup
شما میتوانید کوئریهای $lookup را با اضافه کردن اندیس به مجموعه from بهینه کنید، که به عملیات اجازه میدهد اسناد منطبق را بدون اسکن کل مجموعه، به طور موثر پیدا کند.
$lookup با localField و foreignField
اگر در مرحله $lookup از گزینههای localField و foreignField استفاده میکنید، یک اندیس روی 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"]}}})، یک اندیس روی فیلدهای مربوط به مجموعه خارجی ایجاد کنید. توجه داشته باشید که اندیس چندکلیدی در برنامهریزی استفاده نخواهد شد.
ایجاد ایندکسها
برای ایجاد شاخصها، مستندات مدیریت شاخص را دنبال کنید. برای اطمینان از اینکه پرسوجوی شما میتواند از شاخصها استفاده کند، شاخصهای معمولی (نه چندکلیدی) با فیلدهایی به ترتیب زیر ایجاد کنید:
- تمام فیلدهایی که در عملگرهای تساوی استفاده خواهند شد. برای به حداکثر رساندن احتمال استفاده مجدد در بین پرسوجوها، فیلدها را به ترتیب نزولی وقوع فیلدها در عملگرهای تساوی در بین پرسوجوها مرتب کنید.
- تمام فیلدهایی که بر اساس آنها مرتبسازی انجام خواهد شد (به همان ترتیب).
- فیلدهایی که در عملگرهای برد یا نابرابری به ترتیب نزولی انتخاب محدودیت پرسوجو استفاده خواهند شد.
- فیلدهایی که به عنوان بخشی از یک پرسوجو در فهرست بازگردانده میشوند: گنجاندن چنین فیلدهایی در فهرست به فهرست اجازه میدهد تا پرسوجو را پوشش دهد و از واکشی سند از حافظه اصلی جلوگیری کند.
برای پرسوجوهایی که شامل فیلتر کردن و مرتبسازی فیلدهای آرایهای هستند، ایجاد اندیسهای چندکلید (Multikey) را در نظر بگیرید.
از راهنمای پرسوجو استفاده کنید
اگر یک شاخص مناسبتر برای پرسوجو ایجاد کردهاید اما موتور پرسوجو از آن شاخص استفاده نمیکند، میتوانید با استفاده از یک راهنمای پرسوجو (query hint)، ترجیح شاخص موتور پرسوجو را لغو کنید.
برای اطلاعات بیشتر در مورد خروجی یک پرس و جو اجرا شده با Query Explain، به مرجع اجرای پرس و جو مراجعه کنید.