Database & Backend Engineering

Database Engineering: Optimizing PostgreSQL Query Performance with Advanced Indexing

প্রোডাকশন এনভায়রনমেন্টে ডাটাবেজের সাইজ যখন কয়েক গিগাবাইট ছাড়িয়ে লাখ লাখ বা কোটি রো (Rows)-তে পৌঁছায়, তখন সাধারণ সার্চ কুয়েরিগুলো মারাত্মক স্লো হয়ে যায়। এর প্রধান কারণ ডাটাবেজ ইঞ্জিন পুরো টেবিল শুরু থেকে শেষ পর্যন্ত স্ক্যান করে ডেটা খুঁজে বের করে, টেকনিক্যাল ভাষায় যাকে বলা হয় Sequential Scan (Seq Scan)

**PostgreSQL**-এর কাস্টম ইনডেক্সিং আর্কিটেকচার সঠিকভাবে ব্যবহার করে কুয়েরি এক্সিকিউশন টাইম কয়েক সেকেন্ড থেকে নামিয়ে সরাসরি মিলিসেকেন্ডে (ms) নিয়ে আসা সম্ভব।

১. বি-ট্রি (B-Tree) ইনডেক্স এর রিয়াল ইউজেস

পোস্টগ্রেসের ডিফল্ট ইনডেক্স টাইপ হলো B-Tree। এটি মূলত সাধারণ তুলনামূলক অপারেটর যেমন <, <=, =, >= এর ওপর ভিত্তি করে তৈরি কুয়েরিকে অপ্টিমাইজ করে:

-- ইউজার টেবিলের ইমেইল কলামে একটি স্ট্যান্ডার্ড B-Tree ইনডেক্স ক্রিয়েট করা
CREATE INDEX idx_users_email ON user_profiles_table(email);

ধাপ ২: ফুল-টেক্সট ও জেসন সার্চ অপ্টিমাইজেশন (GIN Index)

যদি আপনার কলামে JSONB ডেটা টাইপ থাকে কিংবা বিশাল টেক্সট ব্লগের ভেতর সাব-স্ট্রিং সার্চ করতে হয়, তবে সাধারণ B-Tree কাজ করবে না। সেখানে ব্যবহার করতে হবে Generalized Inverted Index (GIN):

-- JSONB মেটাডাটা সার্চ অপ্টিমাইজেশনের জন্য GIN ইনডেক্স মেথড ব্যবহার
CREATE INDEX idx_device_logs_jsonb ON hardware_logs USING gin (meta_data_payload);

ধাপ ৩: পারফরম্যান্স টেস্ট করা (`EXPLAIN ANALYZE`)

ইনডেক্স করার পর আপনার কুয়েরি সত্যিই স্পিড আপ হয়েছে কিনা এবং ব্যাকএন্ড ইঞ্জিন ইনডেক্স ব্যবহার করছে কিনা তা টার্মিনালে টেস্ট করার প্রফেশনাল কমান্ড:

EXPLAIN ANALYZE 
SELECT * FROM user_profiles_table 
WHERE email = 'info@ahyancreations.top';

আউটপুটে যদি Index Scan using idx_users_email... লেখাটি দেখতে পান, তার মানে আপনার কুয়েরি অপ্টিমাইজড পাইপলাইনে রান করছে।

ক্রিটিক্যাল ওয়ার্নিং: ইনডেক্সিং কিন্তু একদম ফ্রি নয়। টেবিলের প্রতিটা ইনডেক্স আপনার ডিস্কের অতিরিক্ত স্পেস গ্রাস করে এবং প্রতিটি নতুন ডেটা INSERT বা UPDATE করার সময় রাইটিং স্পিড কিছুটা স্লো করে দেয়। তাই শুধুমাত্র ফিল্টারিং বা WHERE ক্লজে ঘনঘন ব্যবহার করা কলামগুলোতেই ইনডেক্স তৈরি করুন।