Email: info@jugbd.org

ডেটাবেস ইন্ডেক্সিং কী

ডেটাবেস ইন্ডেক্সিং কী


পটভূমি

মনে করেন আপনি ডেটা স্ট্রাকচার বিষয়ে একটি বই পড়ছেন এবং কিছু তথ্য বের করতে চান, ধরেন  হ্যাশিং । আপনি যদি আগে থেকে না জানেন বিষয়টা কোথায় তাহলে আপনাকে প্রতিটা পাতা ধরে ধরে খুঁজতে হবে । যদি এই বিষয়টা একাধিক পাতায় থাকে তবে হতে পারে পুরা বইটাই খোঁজা লাগবে । কিন্তু বাস্তবে আমরা কি করি, আমাদের বই এর শেষ এ ইনডেক্স থাকে, সেখানে বিষয়টা খোঁজ করি এবং পাতার নাম্বার পাই ( সূচিপত্র না ধরে )। তারপর পাতার নাম্বার ধরে আমরা আমাদের কাঙ্ক্ষিত বিষয়টার মূল পাতা পাই । এইভাবে আমরা ইনডেক্সিংয়ের মাধ্যমে খুব দ্রুত একটা বিষয় খোঁজ করতে পারি ।

ইনডেক্সিং কেন দরকার?

আমরা এখন পরের উদাহরণ ডেটাবেস থেকে ডেটা আনার সাথে তুলনা করতে পারি। মনে করেন ডেটাবেসে একটা টেবিল আছে User এবং এর ৪টা কলাম হচ্ছে id, email, name, address । এই টেবিলে ১০০০০ রেকর্ড আছে। এখন যদি বলা হয় যার/যাদের example@gmail.com ইমেইল আছে তার/তাদের রেকর্ড বের করার জন্য তাহলে আমাদের প্রতিটা রেকর্ড ধরে ধরে খোঁজ করতে হবে শুরু থেকে শেষ পর্যন্ত(একাধিক রেকর্ড যদি থাকে)। এটাকে বলে full table scan । এখন আমরা বইয়ের বিষয় খোঁজার মত যদি এখানেও ইনডেক্সিং ব্যবহার করতে পারতাম, তাহলে নিশ্চয়ই রেকর্ড খুঁজতে অনেক কম সময় লাগবে। এখানে আমরা ১০০০০ রেকর্ড নিয়ে বলতেছি, কিন্তু বাস্তবে ডেটাবেস টেবিলে আরও অনেক বেশি ডেটা থাকে। তাই ডেটাবেস থেকে যেন খুব দ্রুত ডেটা খোঁজা যাই তার জন্য আমরা ইনডেক্সিং ব্যবহার করতে পারি, এতে করে কর্মক্ষমতা অনেক বাড়বে।

ইনডেক্সিং কী?

ইনডেক্স হচ্ছে এক ধরনের ডেটা স্ট্রাকচার সাধারনত  B Tree/Hash Table যা কিনা কোন একটা টেবিলের একটা নির্দিষ্ট কলামের ডেটা সংরক্ষণ করে। ইনডেক্স একটা টেবিলের একটা কলামের ওপর তৈরি হয়, ওই কলামের ভ্যালু এবং মূল রেকর্ডের পয়েন্টার একটা ডেটা স্ট্রাকচারে সংরক্ষণ করে। তারপর এই ইনডেক্স স্ট্রাকচার সর্ট করা হয় (B Tree) যাতে করে খুব সহজে বাইনারি সার্চ করা যায় ।

ইনডেক্সিং করতে গেলে বাড়তি ডিস্ক স্পেস লাগে, যেহেতু ইনডেক্স একটা টেবিলে সংরক্ষণ করা হয় (MyISAM Engine ব্যবহার করা হয়), একটা টেবিলের অনেকগুলো কলাম ইনডেক্স করলে এটা খুব দ্রুতই ফাইল সিস্টেমের লিমিটে পৌঁছে যেতে পারে ।

নিচের কমান্ড ব্যবহার করে আমরা খুব সহজেই ইনডেক্স তৈরি করতে পারি :

একাধিক কলাম হলে :

বি ট্রি

B- tree হচ্ছে ইনডেক্সিং এর জন্য সবচেয়ে কমন ডেটা স্ট্রাকচার । এটা একটা Self-balancing ডেটা স্ট্রাকচার যা কিনা ডেটা সর্টেড রাখে এবং সার্চিং, ইন্সার্টশন, ডিলেশন লগারিদ্মিক সময়ে করে থাকে । নিচে একটা B- tree এর চিত্র দেয়া হল –

হ্যাঁশ টেবিল

Hash table হচ্ছে ইনডেক্সিংয়ের আরেকটি ডেটা স্ট্রাকচার যা অনেক সময় হ্যাঁশ ইনডেক্স নামেও বলা হয় । হ্যাঁশ ইনডেক্স কোন একটা ভ্যালু খুজার জন্য খুব কার্যকর বিশেষ করে সমান ভ্যালু তুলনা করে। মূলত হ্যাঁশ ইনডেক্সে কি হিসেবে থাকে যার উপর ইনডেক্সিং করা হই সেই কলাম এবং ভ্যালু হিসেবে থাকে একটা পয়েন্টার যা কিনা টেবিলের রেকর্ডের ঠিকানা সংরক্ষণ করে। কোন একটা বিষয় বা কলাম ডেটা পুরা টেবিলে খোঁজার থেকে একটা হ্যাঁশ ইনডেক্সে খুঁজলে অবশ্যই অনেক বেশি দ্রুত হবে। নিচে একটা হ্যাঁশ ইনডেক্সের চিত্র দেয়া হল –

ইনডেক্সিং কিভাবে কাজ করে?

ধরেন, আমাদের ইউজার টেবিল এ ১,০০০,০০০ রেকর্ড আছে । আমরা কোন একটা ইমেইলের বিপরীতে রেকর্ড খুজব। যেহেতু ইমেইল কলাম সর্টেড না এবং কি কলাম না, আমাদের কে পুরা টেবিল টাই খুঁজতে হবে অর্থাৎ ১,০০০,০০০ রেকর্ড । বাস্তবে হয়তবা আমাদের এত রেকর্ড দেখা লাগবে না কারন প্রত্যেকটা রেকর্ড বিভিন্ন ব্লকে গ্রুপ করা থাকে। যদি একটা ব্লক ২ কিলোবাইট হয় এবং একটা রেকর্ড (এখানে ৪ টা কলাম, নরমালি আরও বেশি) এর জন্য ২০৪ বাইট জায়গা দরকার হয়, তাহলে একটা ব্লক এ রেকর্ড রাখা যাবে (২০৪৮/২০৪)  ১০ টা । অর্থাৎ মোট ব্লক লাগবে ১০০,০০০ টা । এখন যদি আমরা একটা ইমেইলের জন্য রেকর্ড খুঁজি তাহলে আমাদের ১০০,০০০ টা ব্লক খুঁজতে হবে ।

আমরা এখন ইমেইল এর ইনডেক্সিং করে ডেটা খুজা দেখব । ধরেন, একটা ইমেইলের ইনডেক্সিংয়ের রেকর্ড রাখতে ৫০ বাইট(ইমেইল এবং পয়েন্টার কলাম) জায়গা লাগে, তাহলে একটা ব্লকে রেকর্ড থাকতে পারবে ৪০ টা। তাহলে আমাদের মোট ব্লক খুঁজতে হবে (১,০০০,০০০/৪০) ২৫,০০০ টা । ইনডেক্সিংয়ে যেহেতু আমরা আমাদের কি সরটেড করে রাখি, তাই রেকর্ড খুঁজতে আমরা বাইনারি সার্চ করতে পারব অর্থাৎ ইমেইল খুঁজতে আমাদের (log ২৫,০০০)  ১৫ টা ব্লক খোঁজা লাগবে । আর প্রকৃত রেকর্ড পেতে আমাদের ইনডেক্সিংয়ের রেকর্ডের পয়েন্টার যে ব্লকের ঠিকানা রাখে সেই ব্লকসহ মোট ১৬ টা ব্লক খুঁজতে হবে ।

অর্থাৎ আগে যেখানে ১০০,০০০ ব্লক খোঁজা লাগত সেটা ইনডেক্সিং ব্যাবহার করে লাগছে মাত্র ১৬ ব্লক !!!

এখন প্রশ্ন আসতে পারে ডেটাবেস কীভাবে বুঝবে কখন ইনডেক্সিং ব্যবহার করা লাগবে। আমরা যখন কোন কুয়েরি করি তখন ডেটাবেস দেখে ওই কলামের জন্য কোন ইনডেক্সিং করা আছে কিনা। যদি থাকে তারপর এটা ঠিক করে আদৌ ইনডেক্সিং ব্যবহার করা দরকার কিনা। যদি দরকার মনে হয় অর্থাৎ ইনডেক্সিং ব্যবহার কার্যকর মনে হই তবে এটা ইনডেক্সিং ব্যবহার করে ।

ইনডেক্সিং করার সময় যা মনে রাখা উচিত

ইনডেক্সিং করার জন্য একটা অতিরিক্ত জায়গার দরকার হয় । আমাদের টেবিল যত বড় হবে, ইনডেক্সিং ও তত বড় হবে। টেবিলের কোন অপারেশন যেমন রেকর্ড যোগ করা, সরানো বা পরিবর্তন করলে আমাদের ইনডেক্সেও একই অপারেশন করা লাগবে। মনে রাখতে হবে ইনডেক্সিংয়ের ডেটা সব সময় আপ-টু-ডেট থাকা লাগবে টেবিলের ওই কলামের রেকর্ডের সাথে ।

মূলত সার্চ করার জন্যই ইনডেক্সিং ব্যবহার করা হয়, তাই যে সব কলাম খুব বেশি সার্চ হয় সেসব কলাম-ই ইনডেক্সিং করা উচিত ।

যেসব কলাম এ ইনডেক্সিং করা হয় সেসব কলাম এ NOT NULL attribute ব্যবহার করা উচিত, NULL ভ্যালু কখনই রাখা উচিত না ।


Links

Have any Question or Comment?

One comment on “ডেটাবেস ইন্ডেক্সিং কী

Leave a Reply

Your email address will not be published. Required fields are marked *

5 mistakes Java developers make that prevent them from working on awesome projects

Subscribe to Blog via Email

Enter your email address to subscribe to this blog and receive notifications of new posts by email.

Join 1,211 other subscribers

%d bloggers like this: