Apache Cassandra একটি ডিস্ট্রিবিউটেড NoSQL ডেটাবেস সিস্টেম যা বিশেষভাবে স্কেলেবিলিটি, পারফরম্যান্স এবং হাই অ্যাভেইলেবিলিটি নিশ্চিত করতে ডিজাইন করা হয়েছে। Cassandra ডেটা মডেল এবং স্টোরেজ ডিজাইন রিলেশনাল ডেটাবেস সিস্টেম থেকে কিছুটা ভিন্ন। ডেটাকে দ্রুত অ্যাক্সেস এবং খোঁজা নিশ্চিত করার জন্য Primary Index এবং Secondary Index ব্যবহার করা হয়। এই দুটি ইনডেক্স ডেটা রিড অপারেশনগুলিকে আরও দ্রুত এবং কার্যকরী করে তোলে।
1. Primary Index (প্রাইমারি ইনডেক্স)
Primary Index হলো ডেটার Primary Key দ্বারা তৈরি হওয়া ইনডেক্স, যা Cassandra তে ডেটাকে এককভাবে চিহ্নিত করে। এই ইনডেক্সের মাধ্যমে ডেটা দ্রুত খোঁজা যায় এবং রেকর্ডের অবস্থান নির্ধারণ করা সহজ হয়।
Primary Index এর কাজ:
- ডেটা পার্টিশনিং: Cassandra তে Primary Index তৈরি করা হয় Primary Key ব্যবহার করে, যা ডেটাকে পার্টিশন করে। এর মাধ্যমে ডেটা কীভাবে এবং কোথায় সংরক্ষিত হবে তা নির্ধারণ করা হয়।
- Partition Key এবং Clustering Key: Primary Index সাধারণত Partition Key এবং Clustering Key এর সংমিশ্রণে গঠিত হয়। Partition Key সিস্টেমের মধ্যে ডেটার অবস্থান নির্ধারণ করে, এবং Clustering Key একই পার্টিশনের মধ্যে ডেটাকে সাজাতে সাহায্য করে।
Primary Index এর উদাহরণ:
ধরা যাক, আপনি একটি users টেবিল তৈরি করেছেন, যেখানে user_id এবং region ব্যবহার করা হয়েছে:
CREATE TABLE users (
user_id UUID,
region TEXT,
first_name TEXT,
last_name TEXT,
PRIMARY KEY (user_id, region)
);
এখানে:
- user_id হলো Partition Key, যা ডেটাকে সঠিক নোডে পার্টিশন করে এবং সেই অনুযায়ী ডেটা সংরক্ষণ করে।
- region হলো Clustering Key, যা একই user_id এর অধীনে ডেটাকে সাজায়।
Primary Index এর মাধ্যমে Cassandra দ্রুত ডেটা অ্যাক্সেস করতে পারে কারণ এটি Partition Key এর উপর ভিত্তি করে ডেটার অবস্থান নির্ধারণ করে।
2. Secondary Index (সেকেন্ডারি ইনডেক্স)
Secondary Index হলো এমন একটি ইনডেক্স যা Cassandra তে non-primary কলামগুলোর জন্য তৈরি করা হয়। এটি সেই কলামগুলিতে ইনডেক্স তৈরি করে, যা Primary Key বা Partition Key এর অংশ নয়। Secondary Index ব্যবহার করার মাধ্যমে আপনি টেবিলের কলামগুলিতে সহজেই কুয়েরি করতে পারেন, এমনকি যখন সেই কলাম Primary Key বা Clustering Key অংশ না হয়।
Secondary Index এর কাজ:
- Non-Primary Columns: Secondary Index শুধুমাত্র সেই কলামগুলির জন্য তৈরি করা যায় যা Primary Key বা Clustering Key এর অংশ নয়।
- Flexible Queries: Secondary Index ব্যবহার করে আপনি টেবিলের কোনো কলামকে কুয়েরি করতে পারেন, যা মূলত Primary Key এর বাইরে। তবে, Secondary Index বেশিরভাগ সময় বড় টেবিল বা বিশাল ডেটাসেটের জন্য পারফরম্যান্সে সমস্যা তৈরি করতে পারে।
Secondary Index এর উদাহরণ:
ধরা যাক, আপনি users টেবিলের মধ্যে first_name কলামে Secondary Index তৈরি করতে চান:
CREATE INDEX ON users (first_name);
এখানে, first_name কলামে Secondary Index তৈরি করা হয়েছে, যা আপনাকে first_name এর ভিত্তিতে কুয়েরি চালানোর সুবিধা দেয়। যেমন:
SELECT * FROM users WHERE first_name = 'John';
এটি একটি সাধারণ কুয়েরি যেখানে Secondary Index ব্যবহার করা হয়েছে first_name কলামকে কুয়েরি করার জন্য।
Secondary Index এর সুবিধা এবং সীমাবদ্ধতা:
- সুবিধা: Secondary Index ব্যবহার করে আপনি সেই কলামগুলির উপর কুয়েরি চালাতে পারেন যেগুলি Primary Key বা Clustering Key এর অংশ নয়।
- সীমাবদ্ধতা: Secondary Index সাধারণত পারফরম্যান্সে কম কার্যকরী হয়, বিশেষত যখন ডেটা বড় আকারে থাকে। কারণ, এটি অতিরিক্ত ইনডেক্স ক্রিয়েশন এবং কুয়েরি প্রসেসিং তৈরি করে।
3. Primary Index এবং Secondary Index এর মধ্যে পার্থক্য
| বৈশিষ্ট্য | Primary Index | Secondary Index |
|---|---|---|
| কী দ্বারা নির্ধারণ | Primary Key (Partition Key এবং Clustering Key) | Non-primary columns |
| পারফরম্যান্স | দ্রুত এবং স্কেলেবল, কারণ এটি পার্টিশনিং এবং ক্লাস্টারিংকে প্রাধান্য দেয় | বড় টেবিল বা ডেটা সেটে পারফরম্যান্স সমস্যার সৃষ্টি হতে পারে |
| ব্যবহার | ডেটাকে সঠিকভাবে ভাগ এবং সাজানোর জন্য ব্যবহৃত | টেবিলের অন্য কলামগুলির জন্য কুয়েরি করতে ব্যবহৃত |
| তথ্য সুরক্ষা | একটি ইউনিক রেকর্ড সনাক্ত করার জন্য ব্যবহৃত | কেবলমাত্র ডেটা রিড অপারেশনের জন্য ব্যবহৃত |
| উদাহরণ | user_id এবং region এর সংমিশ্রণ | first_name (যা Primary Key বা Clustering Key নয়) |
4. Primary Index এবং Secondary Index এর ব্যবহার: বাস্তব জীবনে উদাহরণ
Primary Index ব্যবহার:
আপনি যদি একটি bank_accounts টেবিল তৈরি করেন যেখানে account_id এবং branch_code ব্যবহার হচ্ছে:
CREATE TABLE bank_accounts (
account_id UUID,
branch_code TEXT,
account_balance DECIMAL,
PRIMARY KEY (account_id, branch_code)
);
এখানে account_id এবং branch_code এর সংমিশ্রণ একটি Primary Index তৈরি করবে। এর মাধ্যমে আপনি একটি নির্দিষ্ট account_id বা branch_code এর ভিত্তিতে দ্রুত কুয়েরি চালাতে পারবেন।
Secondary Index ব্যবহার:
যদি আপনি bank_accounts টেবিলে account_balance কলামের উপর Secondary Index তৈরি করতে চান, তাহলে:
CREATE INDEX ON bank_accounts (account_balance);
এটি আপনাকে account_balance এর ভিত্তিতে কুয়েরি করতে সহায়তা করবে, যেমন:
SELECT * FROM bank_accounts WHERE account_balance > 5000;
এটি একটি উদাহরণ যেখানে Secondary Index ব্যবহার করা হয়েছে account_balance কলামের উপর কুয়েরি চালানোর জন্য।
5. Secondary Index ব্যবহারের কৌশল এবং পারফরম্যান্স বুদ্ধিমত্তা
- Limited Use Case: Secondary Index সাধারনত ছোট টেবিলের জন্য ভালো কাজ করে, যেখানে ডেটার পরিমাণ কম থাকে। বড় টেবিলের জন্য পারফরম্যান্সের সমস্যা তৈরি হতে পারে।
- Query-Driven Design: Cassandra তে স্কিমা ডিজাইন করার সময় কুয়েরি প্যাটার্ন বিবেচনা করা গুরুত্বপূর্ণ। Secondary Index সাধারণত সেই কলামগুলিতে তৈরি করা উচিত যা সাধারণত ফিল্টারিং বা কুয়েরি চালানোর জন্য ব্যবহৃত হয়।
- Use for High Cardinality Columns: Secondary Index মূলত high-cardinality columns (যেমন, ইউজারের নাম বা অ্যাড্রেস) এর জন্য উপযুক্ত, যেখানে ডেটার সংখ্যা অনেক এবং দ্রুত অ্যাক্সেসের প্রয়োজন হয়।
সারাংশ
Primary Index এবং Secondary Index হল Cassandra-র দুটি গুরুত্বপূর্ণ কৌশল যা ডেটা অ্যাক্সেস এবং কুয়েরি অপ্টিমাইজেশনে সহায়তা করে। Primary Index ডেটাকে পার্টিশন এবং ক্লাস্টারিং করে দ্রুত অ্যাক্সেস নিশ্চিত করে, যখন Secondary Index ডেটার অন্যান্য কলামগুলিতে কুয়েরি করার সুবিধা দেয়। তবে, Secondary Index এর ব্যবহার করার সময় বড় ডেটাসেটের জন্য পারফরম্যান্সের সমস্যা হতে পারে, তাই এটি সাবধানে ব্যবহৃত হওয়া উচিত।
Read more