Chapters of Frontend Dev থেকে Full-Stack Backend

Week 2 - Database DepthChapter 9 of 282 min read

Englishবাংলা

Index আর performance - slow query ধরা আর ঠিক করা

Index কীভাবে কাজ করে, কখন লাগে আর কখন লাগে না, EXPLAIN, connection pooling

একটা বইয়ের শেষে সূচিপত্র থাকলে নির্দিষ্ট 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 দিয়ে, অনুমান দিয়ে নয়।

All chapters of Frontend Dev থেকে Full-Stack Backend