একটা বইয়ের শেষে সূচিপত্র থাকলে নির্দিষ্ট topic খুঁজতে পুরো বই পড়তে হয় না। Database index ঠিক তাই। Index ছাড়া database-কে একটা user খুঁজতে পুরো টেবিল একটা একটা করে দেখতে হয় - একে বলে full table scan। টেবিলে ১০০ সারি থাকলে সমস্যা নেই, ১০ লাখ থাকলে প্রতিটা query কয়েক সেকেন্ড নিয়ে নেয়।
Index কাজ করে B-tree গঠনে - সাজানো থাকে বলে খোঁজা হয় লাফ দিয়ে দিয়ে, একে একে নয়। যে column দিয়ে সবচেয়ে বেশি খোঁজা হয় (WHERE-এ আসে), যেটা দিয়ে JOIN হয়, যেটা দিয়ে sort হয় - সেগুলোতেই index লাগে। Email দিয়ে login হয়? Email-এ index। Order সবসময় user_id দিয়ে আসে? user_id-তে index।
তাহলে সব column-এ index দিলেই তো হয়?
না - এখানেই বিচারটা। প্রতিটা index আলাদা জায়গা খায়, আর প্রতিবার insert বা update-এর সময় সব index-কেও আপডেট করতে হয়। Index বেশি হলে পড়া দ্রুত হলেও লেখা ধীর হয়ে যায়। তাই নিয়ম: পড়ার ধরন বুঝে, মেপে মেপে index।
EXPLAIN - অনুমান নয়, প্রমাণ দেখুন
Query ধীর কেন, সেটা অনুমান না করে EXPLAIN চালিয়ে দেখুন। Database নিজেই বলে দেবে সে কোন পথে যাচ্ছে - index ব্যবহার করছে, নাকি পুরো টেবিল ঘাঁটছে (type: ALL দেখলে সেটাই সন্দেহ)।
EXPLAIN SELECT * FROM orders WHERE user_id = 42;
-- index যোগ করা
CREATE INDEX idx_orders_user_id ON orders(user_id);
-- একাধিক column মিলিয়ে (composite) index
CREATE INDEX idx_orders_user_status ON orders(user_id, status);Connection pooling - আরেকটা গোপন খরচ
Database-এর সাথে নতুন connection বানানো ব্যয়বহুল কাজ। প্রতিটা request-এ নতুন connection খুলে বন্ধ করলে server দ্রুত চাপে পড়ে যায়। Pooling মানে নির্দিষ্ট সংখ্যক connection তৈরি রেখে সবাই ঘুরিয়ে ঘুরিয়ে ব্যবহার করা - Prisma বা যেকোনো ভালো driver এটা নিজে থেকেই সামলায়, শুধু pool size-টা প্রয়োজনের সঙ্গে মানিয়ে নিতে হয়।
সবাই যে ভুলটা করে
দুটো চরম ভুল দেখা যায়: কোথাও index না দেওয়া (লঞ্চের পর user বাড়লেই site ধীর), আর সব জায়গায় index দেওয়া (লেখা ধীর, জায়গা বেশি)। আরেকটা ভুল - EXPLAIN না দেখে আন্দাজে optimize করা। আগে মাপুন, তারপর ঠিক করুন।
আজকের Practice
আগের দিনের orders টেবিলে ইচ্ছা করে হাজার দশেক সারি ঢোকান (ছোট একটা script দিয়ে)। তারপর user_id দিয়ে query চালিয়ে সময় দেখুন, index দিন, আবার সময় দেখুন। দুটো EXPLAIN output পাশাপাশি রেখে পার্থক্যটা নিজে পড়ুন।
Interview-এ কীভাবে বলবেন
Index হলো সাজানো সূচি, যাতে database পুরো টেবিল না ঘেঁটে সরাসরি সারিতে পৌঁছাতে পারে। আমি index দিই সেই column-গুলোতে যেগুলো দিয়ে বেশি খোঁজা, join আর sort হয় - তবে মেপে, কারণ প্রতিটা index লেখার গতি কমায়। Slow query ধরি EXPLAIN দিয়ে, অনুমান দিয়ে নয়।