ডেটাবেজকে শুধু একটি ইনডেক্স ধরিয়ে দিলেই কাজ শেষ হয় না, ইনডেক্সটি কতটা 'সিলেক্টিভ' বা কার্যকর, সেটিই ঠিক করে আপনার কুয়েরি মিলিসেকেন্ডে চলবে নাকি মিনিটে। ইনডেক্সিংয়ের দুনিয়ায় Selectivity হলো সেই চাবিকাঠি যা ইনডেক্সিং এর কার্যকারিতা নির্ধারণ করে।
ডেটাবেজ যখন কোনো ইনডেক্স ব্যবহার করবে কি না তা সিদ্ধান্ত নেয়, তখন সে একটি বিশেষ হিসাব করে— Selectivity। এটি আপনাকে বলে যে একটি ইনডেক্স ব্যবহার করলে কত দ্রুত আপনি কাঙ্ক্ষিত রেজাল্টে পৌঁছাতে পারবেন।
১. Overview
Selectivity হলো একটি কলামের ইউনিক ভ্যালুর অনুপাত। সহজ কথায়, এটি নির্দেশ করে একটি ইনডেক্স কত দ্রুত অপ্রয়োজনীয় ডেটাগুলোকে "ছেঁটে ফেলতে" (Filter out) পারে।
High Selectivity: একটি ইনডেক্স যা খুব দ্রুত রেজাল্ট সেটকে ছোট করে আনে (যেমন- Email, User_ID)।
Low Selectivity: একটি ইনডেক্স যা ফিল্টার করার পরও অনেক বেশি ডেটা রেখে দেয় (যেমন- Gender, Status)।
২. গাণিতিক সূত্র (The Formula)
Selectivity = Number of Unique Values / Total Number Of Rows
যদি রেজাল্ট ১.০ (বা ১০০%) এর কাছাকাছি হয়, তবে সেটি Excellent Selectivity (যেমন- Primary Key)। যদি রেজাল্ট ০.০১ (বা ১%) এর কাছাকাছি হয়, তবে সেটি Poor Selectivity।
৩. কেন Low Selectivity ইনডেক্স বিপজ্জনক
ধরুন আপনার টেবিলে ১ লাখ রো আছে এবং Gender কলামে ইনডেক্স আছে। আপনি কুয়েরি করলেন: SELECT * FROM users WHERE gender = 'Male';
যেহেতু প্রায় ৫০% ইউজার মেল (Male), ডেটাবেজ দেখবে যে ইনডেক্স ব্যবহার করে ৫০ হাজার বার ডিস্কে জাম্প করার চেয়ে পুরো টেবিল একবার পড়ে ফেলা (Full Table Scan) অনেক বেশি সাশ্রয়ী। ফলে, আপনার তৈরি করা ইনডেক্সটি ডেটাবেজ কোনো কাজেই লাগাবে না!
Rule Of Thumb: যদি কোনো ইনডেক্স টেবিলের ১০-১৫% এর বেশি ডেটা রিটার্ন করে, তবে ডেটাবেজ সাধারণত সেই ইনডেক্সটি ব্যবহার না করে "Full Table Scan" করতে পছন্দ করে।
৪. Cardinality vs. Selectivity
অনেকেই প্রায়ই এই দুটি শব্দ গুলিয়ে ফেলে:
Cardinality: এটি একটি কলামে মোট কতগুলো ইউনিক ভ্যালু আছে তার সংখ্যা (যেমন- ১০টি বা ৫০০০টি)।
Selectivity: এটি মোট রো-এর তুলনায় ওই ইউনিক ভ্যালুর অনুপাত বা শতাংশ।
৬. বাস্তব জীবনের উদাহরণ (The Library Analogy)
একটি বিশাল লাইব্রেরিতে আপনি বই খুঁজছেন: High Selectivity: আপনি "বইয়ের ইউনিক আইডি (ISBN)" দিয়ে খুঁজছেন। আপনি সরাসরি ১টি বই পাবেন। (Best!)
Low Selectivity: আপনি "বাংলা ভাষার বই" খুঁজছেন। লাইব্রেরিয়ান বলবে, "এই ১০ হাজার বইয়ের সবই বাংলা ভাষায়, নিজে খুঁজে নিন।" (Useless index!)
নোটঃ
Composite Indexing: যদি কোনো সিঙ্গেল কলামের সিলেক্টিভিটি কম হয়, তবে সেটিকে অন্য কলামের সাথে যুক্ত করে (Composite Index) সিলেক্টিভিটি বাড়ানো যায়। যেমন- শুধু Gender নয়, বরং (Gender, City)।
Column Histogram: ডেটাবেজ একটি "Histogram" মেইনটেইন করে যেখানে সে জানে কোন ভ্যালু কতবার আছে। কুয়েরি লেখার আগে ANALYZE বা VACUUM কমান্ড দিয়ে স্ট্যাটিস্টিকস আপডেট রাখুন।
Don't Over-Index: লো-সিলেক্টিভিটি কলামে ইনডেক্স দিলে সেটি শুধু রাইট অপারেশন (Insert/Update) স্লো করবে, রিড পারফরম্যান্সে কোনো লাভ দিবে না।
Summary
Index Selectivity হলো আপনার ইনডেক্সের "কার্যকারিতার সার্টিফিকেট"। ইনডেক্স বানানোর আগে নিজেকে প্রশ্ন করুন— "এই কলামটি দিয়ে ফিল্টার করলে কি আমি খুব দ্রুত ১% বা তার কম ডেটাতে পৌঁছাতে পারব?" যদি উত্তর 'না' হয়, তবে ইনডেক্সটি না করাই শ্রেয়।