ধীরগতির কোয়েরির সমস্যা সমাধান করতে, কোয়েরি এক্সিকিউশন প্ল্যান ও রানটাইম এক্সিকিউশন প্রোফাইল পেতে কোয়েরি এক্সপ্লেন ব্যবহার করুন। এক্সিকিউশন প্রোফাইলের উপর নির্ভর করে কোয়েরি পারফর্ম্যান্স অপ্টিমাইজ করার জন্য আপনি যেসব পদক্ষেপ নিতে পারেন তা নিম্নলিখিত বিভাগে বর্ণনা করা হয়েছে:
ফলাফলের সংখ্যা সীমিত করুন
কোয়েরি অনেক ডকুমেন্ট রিটার্ন করছে কিনা তা শনাক্ত করতে এক্সিকিউশন ট্রিতে রিটার্ন করা রেকর্ডের ফিল্ড ব্যবহার করুন। $limitক্লজ ব্যবহার করে
ফিরে আসা ডকুমেন্টের সংখ্যা সীমিত করার কথা বিবেচনা করুন। নেটওয়ার্কের মাধ্যমে ক্লায়েন্টকে ফলাফল ফেরত পাঠানোর সময়
এটি ফলাফলের সিরিয়ালাইজ করা বাইট সাইজ কম করে। যেসব ক্ষেত্রে Limit নোডের
আগে MajorSort নোড থাকে, সেখানে কোয়েরি ইঞ্জিন Limit
ও MajorSort নোডকে একত্রিত করতে পারে এবং সম্পূর্ণ ইন-মেমরি মেটেরিয়ালাইজেশন ও
সর্টকে TopN সর্ট দিয়ে প্রতিস্থাপন করে, যার ফলে কোয়েরির জন্য মেমরির প্রয়োজনীয়তা কমে যায়।
ফলাফল ডকুমেন্টের সাইজ সীমিত করুন
অপ্রয়োজনীয় ফিল্ড ফেচ করা এড়াতে, $project
ক্লজ ব্যবহার করে রিটার্ন করা ডকুমেন্টের সাইজ সীমিত করার কথা বিবেচনা করুন। এটি ইন্টারমিডিয়েট ফলাফল প্রসেস করার জন্য কম্পিউট ও মেমরি খরচ এবং নেটওয়ার্কের মাধ্যমে ক্লায়েন্টকে ফলাফল পাঠানোর সময় ফলাফলের সিরিয়ালাইজ করা বাইট সাইজ কমাতে সাহায্য করে। কোয়েরিতে রেফারেন্স দেওয়া সব ফিল্ড
রেগুলার ইন্ডেক্স (মাল্টিকি নয়) দ্বারা কভার করা হলে,
এটি ইন্ডেক্স স্ক্যান দ্বারা কোয়েরি সম্পূর্ণভাবে কভার করার অনুমতি দেয়, প্রাইমারি স্টোরেজ থেকে ডকুমেন্ট ফেচ করার প্রয়োজন হয় না।
ইনডেক্স ব্যবহার করুন
ইনডেক্স সেট-আপ ও অপ্টিমাইজ করতে নিম্নলিখিত নির্দেশাবলী ব্যবহার করুন।
কোয়েরি কোনও ইন্ডেক্স ব্যবহার করছে কিনা তা শনাক্ত করুন
এক্সিকিউশন ট্রিতে লিফ নোড চেক করে আপনি শনাক্ত করতে পারবেন যে কোয়েরি কোনও ইন্ডেক্স ব্যবহার করছে কিনা। এক্সিকিউশন ট্রির লিফ নোড যদি TableScan নোড হয়, তাহলে বুঝতে হবে যে কোয়েরি কোনও ইন্ডেক্স ব্যবহার করছে না এবং প্রাইমারি স্টোরেজ থেকে ডকুমেন্ট স্ক্যান করছে। কোনও ইন্ডেক্স ব্যবহার করা হলে, এক্সিকিউশন ট্রির লিফ নোড ইন্ডেক্স আইডি এবং ইন্ডেক্সের ইন্ডেক্স ফিল্ড দেখাবে।
ব্যবহৃত ইন্ডেক্স অপ্টিমাইজ করা যাবে কিনা তা শনাক্ত করুন
কোনও কোয়েরির জন্য ইনডেক্স তখনই উপযোগী হয় যখন এটি কোয়েরি ইঞ্জিনের প্রাইমারি স্টোরেজ থেকে ডকুমেন্ট আনার সংখ্যা কমাতে পারে অথবা এর ফিল্ড অর্ডারিং কোয়েরির সাজানোর প্রয়োজনীয়তা পূরণ করতে পারে।
কোনও কোয়েরির জন্য ইন্ডেক্স ব্যবহার করা হলেও, কোয়েরি ইঞ্জিন এখনও অনেক ডকুমেন্ট ফেচ ও বাতিল করছে, যেমন, স্ক্যান নোড দ্বারা শনাক্ত করা হয়েছে যে, এটি অনেক রেকর্ড রিটার্ন করে এবং তারপরে ফিল্টার নোড অল্প কিছু রেকর্ড রিটার্ন করে, এটি থেকে বোঝা যায় যে ইন্ডেক্স ব্যবহার করে কোয়েরি প্রেডিকেট সন্তুষ্ট করা বেছে নেওয়া হয়নি। আরও উপযুক্ত ইন্ডেক্স তৈরি করতে, ইন্ডেক্স তৈরি করুন দেখুন।
কোনও কোয়েরির জন্য মাল্টি-কী নয় এমন ইন্ডেক্স ব্যবহার করা হলে, কিন্তু কোয়েরি ইঞ্জিন এখনও ফলাফল সেটের ইন-মেমরি রিঅর্ডারিং পারফর্ম করছে, যেমন কোয়েরি এক্সিকিউশন ট্রিতে MajorSort নোড দ্বারা শনাক্ত করা হয়েছে, এটি একটি চিহ্ন যে ব্যবহৃত ইন্ডেক্সটি কোয়েরির Sort প্রয়োজনীয়তা পূরণ করার জন্য ব্যবহার করা যাবে না। আরও উপযুক্ত ইন্ডেক্স তৈরি করতে, পরবর্তী বিভাগ দেখুন।
$lookupটি কোয়েরি অপ্টিমাইজ করা হচ্ছে
আপনি from সংগ্রহে ইন্ডেক্স যোগ করে $lookup কোয়েরি অপ্টিমাইজ করতে পারেন
যা অপারেশনকে পুরো সংগ্রহ স্ক্যান না করেই
ম্যাচিং ডকুমেন্ট দক্ষতার সাথে খুঁজে পেতে দেয়।
localField দিয়ে $lookup এবং foreignField
আপনি $lookup
স্টেজে localField এবং foreignField বিকল্প ব্যবহার করলে, from সংগ্রহে foreignField-এর উপর একটি ইন্ডেক্স তৈরি করুন।
নেস্টেড পাইপলাইন সহ $lookup
আপনি যদি $match
পর্যায়ের সাথে $lookup পর্যায়ে pipeline বিকল্প ব্যবহার করেন, তাহলে সম্পূর্ণ কালেকশন স্ক্যান এড়াতে
ফরেন কালেকশনে অন্তর্ভুক্ত ফিল্ডে একটি ইন্ডেক্স তৈরি করুন:
- ফিল্টার সিম্যান্টিক্স সহ
$matchস্টেজের জন্য (যেমন{$match: {a: true}}), ফরেন কালেকশনে (a) অন্তর্ভুক্ত ফিল্ডে একটি ইন্ডেক্স তৈরি করুন। $matchস্টেজের জন্য অ্যাগ্রিগেশন সিম্যান্টিক্সের সাথে যা একটি ফিল্ডকে কনস্ট্যান্ট ভ্যালুর (যেমন{$match: {$expr: {$gt: [a, 10]}}}) সাথে অথবাlet-এ (যেমন{$match: {$expr: {$eq: [a, "$$a"]}}}) সংজ্ঞায়িত ফিল্ড ও ভেরিয়েবলের মধ্যে ইকুয়ালিটি কম্প্যারিজনের (eqঅথবাin) সাথে তুলনা করে, ফরেন কালেকশনে অন্তর্ভুক্ত ফিল্ডের উপর একটি ইন্ডেক্স তৈরি করুন। মনে রাখবেন যে মাল্টিকি ইন্ডেক্স প্ল্যানিংয়ে ব্যবহার করা হবে না।
ইনডেক্স তৈরি করুন
ইনডেক্স তৈরি করতে ইনডেক্স ম্যানেজমেন্ট ডকুমেন্টেশন ফলো করুন। আপনার কোয়েরি যাতে ইন্ডেক্স ব্যবহার করতে পারে তা নিশ্চিত করতে, নিম্নলিখিত ক্রমে ফিল্ড সহ রেগুলার (মাল্টিকি নয়) ইন্ডেক্স তৈরি করুন:
- ইকুয়ালিটি অপারেটরে ব্যবহার করা হবে এমন সব ফিল্ড। কোয়েরি জুড়ে রিইউজ করার সম্ভাবনা সর্বাধিক করতে, কোয়েরি জুড়ে ইকুয়ালিটি অপারেটরে ফিল্ডের উপস্থিতির নিম্নক্রম অনুসারে ফিল্ডগুলি সাজান।
- যেসব ফিল্ড সাজানো হবে (একই ক্রমে)।
- কোয়েরি কনস্ট্রেন্ট সিলেক্টিভিটির নিম্নক্রম অনুযায়ী রেঞ্জ বা ইনইকুয়ালিটি অপারেটরে ব্যবহার করা হবে এমন ফিল্ড।
- ইনডেক্সে কোয়েরির অংশ হিসেবে যেসব ফিল্ড ফেরত পাঠানো হবে: ইনডেক্সে এই ধরনের ফিল্ড অন্তর্ভুক্ত করলে, ইনডেক্স কোয়েরি কভার করতে পারে এবং প্রাইমারি স্টোরেজ থেকে ডকুমেন্ট নিয়ে আসার প্রয়োজন হয় না।
অ্যারে ফিল্ড ফিল্টার ও সর্ট করার সাথে সম্পর্কিত কোয়েরির জন্য, মাল্টিকি ইন্ডেক্স তৈরি করার কথা বিবেচনা করুন।
কোয়েরি ইঙ্গিত ব্যবহার করুন
আপনি যদি কোয়েরির জন্য আরও উপযুক্ত ইন্ডেক্স তৈরি করে থাকেন কিন্তু কোয়েরি ইঞ্জিন সেই ইন্ডেক্স ব্যবহার না করে, তাহলে আপনি কোয়েরি হিন্ট ব্যবহার করে কোয়েরি ইঞ্জিনের ইন্ডেক্স সংক্রান্ত পছন্দ ওভাররাইড করতে পারেন।
Query Explain-এর মাধ্যমে এক্সিকিউট করা কোয়েরির আউটপুট সম্পর্কে আরও তথ্যের জন্য, কোয়েরি এক্সিকিউশন রেফারেন্স দেখুন।