ধীর কোয়েরি অপ্টিমাইজ করা শুরু হয় এক্সিকিউশন প্ল্যান বিশ্লেষণ (EXPLAIN) দিয়ে বটলনেক খুঁজে পেতে, তারপর লক্ষ্যবদ্ধ সমাধান প্রয়োগ করা — সবচেয়ে সাধারণত ইন্ডেক্স যোগ করা, কোয়েরি পুনর্লিখন করা এবং সাধারণ অ্যান্টি-প্যাটার্ন এড়ানো। সবচেয়ে বড় লাভ সাধারণত সম্পূর্ণ টেবিল স্ক্যানকে ইন্ডেক্স লুকআপে পরিণত করা।
পদক্ষেপ 1: EXPLAIN দিয়ে বিশ্লেষণ করুন
EXPLAIN ANALYZE
SELECT * FROM orders WHERE customer_id = 5;
-- shows the EXECUTION PLAN: scan type (Seq Scan = full scan, Index Scan = using an index),
-- estimated/actual rows, cost, and timing → reveals WHERE the time goes
EXPLAIN (বা EXPLAIN ANALYZE) দেখায় যে ডাটাবেস কোয়েরিটি কীভাবে এক্সিকিউট করে — গুরুত্বপূর্ণভাবে, এটি সম্পূর্ণ টেবিল স্ক্যান (ধীর) করছে নাকি একটি ইন্ডেক্স (দ্রুত) ব্যবহার করছে। অপ্টিমাইজ করার আগে সর্বদা প্রোফাইল করুন।
সবচেয়ে বড় লাভ: ইন্ডেক্স যোগ করুন
-- if EXPLAIN shows a Seq Scan on a filtered/joined column → add an index
CREATE INDEX idx_orders_customer ON orders(customer_id);
-- turns a full scan into a fast index lookup
সবচেয়ে সাধারণ এবং প্রভাবশালী সমাধান: WHERE, JOIN এবং ORDER BY-তে ব্যবহৃত কলামগুলিতে ইন্ডেক্স যোগ করুন। এটি সম্পূর্ণ টেবিল স্ক্যানকে দ্রুত লুকআপে পরিণত করে।
সমাধান করার জন্য সাধারণ অ্যান্টি-প্যাটার্ন
-- ❌ functions on a column prevent index use
WHERE UPPER(email) = '[email protected]' -- can't use an index on email
WHERE email = '[email protected]' -- ✅ can use the index
-- ❌ leading wildcard LIKE can't use an index
WHERE name LIKE '%smith' -- ✅ 'smith%' (prefix) can use an index
-- ❌ SELECT * fetches unneeded columns
SELECT * → SELECT only_needed_columns -- less data, may use a covering index
-- ❌ N+1 queries (querying in a loop) → use a single JOIN instead
অন্যান্য অপ্টিমাইজেশন কৌশল
✓ Fix N+1 queries (one query per row) → use JOINs / batch into one query
✓ Add appropriate indexes (including COMPOSITE for multi-column filters)
✓ Reduce data scanned — filter early, select only needed columns, paginate
✓ Rewrite subqueries as JOINs where more efficient
✓ Use EXISTS instead of IN for existence checks on large subqueries
✓ Keep statistics updated (ANALYZE) so the planner makes good choices
✓ Consider denormalization / materialized views for expensive repeated queries
✓ Watch for missing indexes on FOREIGN KEYS (joins scan without them)
কেন এটি গুরুত্বপূর্ণ
কোয়েরি অপ্টিমাইজেশন ডাটাবেস পারফরম্যান্সের জন্য গুরুত্বপূর্ণ জ্ঞান — ধীর কোয়েরিগুলি দুর্বল অ্যাপ্লিকেশন পারফরম্যান্সের একটি প্রধান কারণ, এবং কীভাবে সেগুলি খুঁজে পেতে এবং সমাধান করতে হয় তা বোঝা বড় আকারে ডাটাবেসের সাথে কাজ করা যে কেউর জন্য একটি অপরিহার্য সিনিয়র-স্তরের দক্ষতা।
মৌলিক শৃঙ্খলা হল EXPLAIN দিয়ে বিশ্লেষণ করা (প্রকৃত বটলনেক খুঁজে পেতে এক্সিকিউশন প্ল্যান পরীক্ষা করা — গুরুত্বপূর্ণভাবে কোয়েরিটি একটি ধীর সম্পূর্ণ টেবিল স্ক্যান বা একটি দ্রুত ইন্ডেক্স লুকআপ করছে কিনা) অনুমানের পরিবর্তে অপ্টিমাইজ করার আগে — এই পরিমাপ-চালিত পদ্ধতি হল যা অপ্টিমাইজেশনকে কার্যকর করে তোলে।
একটি একক সবচেয়ে বড় এবং সবচেয়ে সাধারণ লাভ হল ইন্ডেক্স যোগ করা ফিল্টার করা, যুক্ত এবং সাজানো কলামগুলিতে (সম্পূর্ণ টেবিল স্ক্যানকে দ্রুত লুকআপে পরিণত করা — প্রায়শই কোয়েরি সময় অনেক দশক গুণ উন্নত করে), অপ্টিমাইজেশনের জন্য ইন্ডেক্স জ্ঞানকে কেন্দ্রীয় করে তোলে।
সাধারণ অ্যান্টি-প্যাটার্ন বোঝা সমানভাবে গুরুত্বপূর্ণ: কলামে ফাংশন এবং শীর্ষস্থানীয়-ওয়াইল্ডকার্ড LIKE ইন্ডেক্স ব্যবহার প্রতিরোধ করে, SELECT * অপ্রয়োজনীয় ডেটা আনে, এবং বিশেষত N+1 কোয়েরিজ (একটি লুপে কোয়েরি করা একটি একক JOIN এর পরিবর্তে — অ্যাপ্লিকেশন কোডে একটি ঘন ঘন, গুরুতর পারফরম্যান্স কিলার) — এই সাধারণ কারণগুলি চেনা এবং সমাধান করা ধীর কোয়েরিগুলির সবচেয়ে সাধারণ কারণগুলি সম্বোধন করে।
অন্যান্য কৌশলগুলি (composite ইন্ডেক্সেস, স্ক্যান করা ডেটা হ্রাস করা, subqueries কে JOIN হিসাবে পুনর্লিখন করা, পরিসংখ্যান আপডেট রাখা, ব্যয়বহুল কোয়েরিগুলির জন্য materialized views) টুলকিটকে সম্পূর্ণ করে।
যেহেতু কোয়েরি পারফরম্যান্স সরাসরি অ্যাপ্লিকেশনের প্রতিক্রিয়াশীলতা এবং স্কেলেবিলিটি প্রভাবিত করে, এবং যেহেতু পদ্ধতিগত পদ্ধতি (EXPLAIN দিয়ে বিশ্লেষণ করুন, তারপর সমাধান করুন — সাধারণত ইন্ডেক্স যোগ করে এবং N+1 এর মতো অ্যান্টি-প্যাটার্ন দূর করে) লোডের অধীনে ডাটাবেসগুলি দ্রুত রাখে, কোয়েরি অপ্টিমাইজেশন আয়ত্ত করা গুরুত্বপূর্ণ, উচ্চ-মূল্যের সিনিয়র জ্ঞান যা পারফরম্যান্ট, স্কেলেবল ডাটাবেস-ব্যাকড অ্যাপ্লিকেশনগুলি তৈরি করতে পারে এমন ডেভেলপারদের আলাদা করে — একটি ঘন ঘন-প্রাসঙ্গিক, সমালোচনামূলক দক্ষতা এবং ডাটাবেস পারফরম্যান্সের জন্য একটি সাধারণ সাক্ষাৎকার বিষয়।
