Database index: B-tree কীভাবে query দ্রুত করে

Index-ই query-কে মিনিটের বদলে মিলিসেকেন্ডে আনে। B-tree index কীভাবে কাজ করে এবং কখন সাহায্য বা ক্ষতি করে, জানুন।

table row-এর দিকে নির্দেশ করা সাজানো গাছ

Index ছাড়া row খুঁজতে পুরো table পড়তে হয় (full scan)। Index থাকলে database প্রায় সরাসরি row-তে লাফ দেয়।

বইয়ের উপমা

বইয়ের সূচিপত্র বিষয়গুলো বর্ণানুক্রমে পৃষ্ঠা নম্বরসহ রাখে। "caching" খুঁজতে আপনি পুরো বই পড়েন না। Database index হলো এক বা একাধিক column-এর সাজানো কপি, যাতে পুরো row-র দিকে নির্দেশ থাকে।

B-tree

বেশিরভাগ index B-tree, একটি ভারসাম্যপূর্ণ গাছ। Lookup root থেকে শুরু করে কয়েকটি শাখা ধরে leaf-এ পৌঁছায়, তাই ১০ লাখ row খুঁজতে মাত্র কয়েক ধাপ (প্রায় log n) লাগে, ১০ লাখ পড়তে হয় না। B-tree key সাজানো রাখে, তাই এগুলোতে দারুণ:

  • সমতা: WHERE email = 'a@x.com'
  • পরিসর: WHERE created_at > '2026-10-01'
  • সাজানো: ORDER BY created_at

বানানো

CREATE INDEX idx_articles_author ON articles (author_id);
CREATE UNIQUE INDEX idx_users_email ON users (email);

Primary key ও unique constraint স্বয়ংক্রিয়ভাবে index বানায়। Foreign key column সবসময় index হয় না, তাই নিজে দিন।

Composite index ও leftmost-prefix নিয়ম

(author_id, created_at)-এর index আগে author, তারপর তারিখ ধরে সাজানো। এটি সামলাতে পারে:

  • WHERE author_id = 5
  • WHERE author_id = 5 AND created_at > ...
  • WHERE author_id = 5 ORDER BY created_at

শুধু WHERE created_at > ...-এ সাধারণত সাহায্য করে না, কারণ এটি সবচেয়ে বামের column নয়। আপনি যেভাবে filter করেন সেই ক্রমে column সাজান: আগে সমতার column, তারপর পরিসর বা sort-এর column।

Covering index

Query-র দরকারি সব column index-এ থাকলে database table না ছুঁয়ে শুধু index থেকে উত্তর দেয়। গরম query-তে দ্রুত।

খরচ

  • প্রতিটি INSERT, UPDATE ও DELETE-কে প্রতিটি index-ও আপডেট করতে হয়, তাই বেশি index write ধীর করে।
  • Index disk ও memory নেয়।
  • তাই যা query করেন তা index করুন, প্রতিটি column নয়।

আপনার index কেন ব্যবহার নাও হতে পারে

  • Column-এ function: WHERE LOWER(email) = ... email-এর সাধারণ index ব্যবহার করতে পারে না। Expression index দিন বা normalised data রাখুন।
  • শুরুতে wildcard: LIKE '%word' B-tree ব্যবহার করতে পারে না। LIKE 'word%' পারে।
  • কম selectivity: অল্প আলাদা মানের column-এ (যেমন boolean) index প্রায়ই সাহায্য করে না, কারণ অনেক row মিললে planner scan পছন্দ করে।
  • ধরনের অমিল (সংখ্যা column-কে string-এর সাথে তুলনা)।
  • পুরোনো statistics। ANALYZE চালান।

কীভাবে যাচাই করবেন

EXPLAIN (বা EXPLAIN ANALYZE) ব্যবহার করে index scan বনাম sequential/full scan খুঁজুন। আন্দাজ নয়, মাপুন।

মূল কথা: যে column দিয়ে filter, join ও sort করেন সেগুলো index করুন, composite column সাবধানে সাজান, এবং EXPLAIN দিয়ে যাচাই করুন।


Backend ও Database সিরিজ, পর্ব ১ (SQL ও transaction): 2 নম্বর (মোট 4)। আগের লেখা: SQL JOIN সহজ উদাহরণসহ.

আরও পড়ুন

Recursion ও backtracking সহজ উদাহরণে

Recursion সমস্যার ছোট কপি সমাধান করে সমাধান করে। অনেক interview সমস্যায় ব্যবহৃত চিন্তার ধাপ ও backtracking টেমপ্লেট শিখুন।

Interview ও DSA•৩ মিনিটে পড়া