ডাটাবেসের পারফরম্যান্স অপ্টিমাইজেশনের সবচেয়ে কার্যকরী টুলগুলোর মধ্যে একটি হলো SQL Index। যখন আপনার টেবিলে লাখ লাখ রো থাকে, তখন একটি সাধারণ SELECT কুয়েরি সেকেন্ডের পরিবর্তে মিনিট সময় নিতে পারে। এই টিউটোরিয়ালে আমরা শিখবো ইনডেক্স কী, কেন এটি প্রয়োজন, কীভাবে এটি তৈরি করতে হয়, এবং কোন পরিস্থিতিতে এটি ব্যবহার করা উচিত—সবকিছু বাংলায়, সহজ উদাহরণ সহ।
ইনডেক্স কী এবং কেন এটি প্রয়োজন?
ইনডেক্স হলো একটি ডাটাবেস অবজেক্ট যা টেবিলের ডেটার উপর একটি সাজানো স্ট্রাকচার (সাধারণত B-Tree) তৈরি করে। এটি বইয়ের পৃষ্ঠাসূচীর মতো কাজ করে—আপনি পুরো বই না পড়েই নির্দিষ্ট বিষয় খুঁজে পান। একইভাবে, ইনডেক্স সার্চ অপারেশনকে দ্রুততর করে।
ইনডেক্স ব্যবহারের প্রধান কারণগুলো হলো:
- সার্চ স্পিড বৃদ্ধি:
WHERE,JOIN, এবংORDER BYক্লজের পারফরম্যান্স নাটকীয়ভাবে উন্নত হয়। - ইউনিকনেস নিশ্চিতকরণ:
UNIQUEইনডেক্স ডুপ্লিকেট ডেটা এন্ট্রি প্রতিরোধ করে। - ডাটাবেস রিসোর্স সাশ্রয়: ফুল টেবিল স্ক্যান এড়িয়ে CPU এবং I/O লোড কমায়।
তবে ইনডেক্স বিনামূল্যে নয়—প্রতি INSERT, UPDATE, এবং DELETE অপারেশনে ইনডেক্সও আপডেট হয়, যা কিছু অতিরিক্ত ওভারহেড তৈরি করে।
ইনডেক্সের ধরন এবং সিনট্যাক্স
বিভিন্ন ডাটাবেস ইঞ্জিনে বিভিন্ন ধরনের ইনডেক্স রয়েছে, তবে সবচেয়ে সাধারণ হলো B-Tree ইনডেক্স। নিচে PostgreSQL-এ একটি সাধারণ ইনডেক্স তৈরির উদাহরণ দেওয়া হলো:
-- একটি টেবিল তৈরি
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
department VARCHAR(50),
salary NUMERIC
);
-- একটি সাধারণ ইনডেক্স তৈরি
CREATE INDEX idx_employees_department ON employees(department);
-- ইউনিক ইনডেক্স তৈরি (ডুপ্লিকেট ডিপার্টমেন্ট নাম অনুমোদিত নয়)
CREATE UNIQUE INDEX idx_unique_department ON employees(department);
এখানে idx_employees_department ইনডেক্সটি department কলামের উপর ভিত্তি করে সার্চ দ্রুত করবে। UNIQUE ইনডেক্স নিশ্চিত করে যে একই ডিপার্টমেন্ট নাম দুইবার ঢোকানো যাবে না।
কখন এবং কীভাবে ইনডেক্স ব্যবহার করবেন?
ইনডেক্স সবসময় প্রয়োজনীয় নয়—ভুল জায়গায় ইনডেক্স ব্যবহার করলে পারফরম্যান্স আরও খারাপ হতে পারে। নিচের পরিস্থিতিগুলোতে ইনডেক্স ব্যবহার করা উচিত:
- হাই-কার্ডিনালিটি কলাম: যে কলামে অনেক ভিন্ন ভ্যালু আছে (যেমন
email,employee_id)। - ফ্রিকোয়েন্ট সার্চ কন্ডিশন: যে কলাম নিয়মিত
WHEREক্লজে ব্যবহৃত হয়। - জয়েন কলাম: দুটি টেবিলের মধ্যে
JOINকরার সময় ব্যবহৃত কলাম।
কিন্তু নিচের ক্ষেত্রে ইনডেক্স এড়িয়ে চলুন:
- ছোট টেবিল: যেখানে ১০০-২০০ রো আছে, সেখানে ফুল স্ক্যানই যথেষ্ট।
- লো-কার্ডিনালিটি কলাম: যেমন
gender(শুধু 'Male' বা 'Female'), যেখানে ইনডেক্স কার্যকর নয়। - অনেক বেশি ইনডেক্স: একটি টেবিলে ১০-১৫টির বেশি ইনডেক্স সাধারণত ক্ষতিকর।
বেস্ট প্র্যাকটিস এবং সাধারণ ভুল
ইনডেক্স ডিজাইনের সময় নিচের টিপসগুলো মাথায় রাখুন:
- কম্পোজিট ইনডেক্স ব্যবহার করুন: যদি একাধিক কলামে সার্চ হয়, তাহলে একটি কম্পোজিট ইনডেক্স তৈরি করুন। যেমন:
এটিCREATE INDEX idx_dept_salary ON employees(department, salary);WHERE department = 'IT' AND salary > 50000টাইপের কুয়েরি দ্রুত করবে। - ইনডেক্স মনিটর করুন:
EXPLAINকমান্ড ব্যবহার করে দেখুন আপনার কুয়েরি ইনডেক্স ব্যবহার করছে কিনা:EXPLAIN SELECT * FROM employees WHERE department = 'HR'; - ইনডেক্স রিবিল্ড করুন: নিয়মিত ইনডেক্স ফ্র্যাগমেন্টেশন চেক করে রিবিল্ড করুন, বিশেষ করে বড় টেবিলের ক্ষেত্রে।
সাধারণ ভুলগুলো হলো:
- ইনডেক্স তৈরি করে চেক না করা যে কুয়েরি সেটি ব্যবহার করছে কিনা।
- খুব ছোট টেবিলে ইনডেক্স যুক্ত করা।
LIKE '%keyword'টাইপের সার্চে ইনডেক্স আশা করা (বেশিরভাগ ইনডেক্স লেফটমোস্ট প্রিফিক্স সার্চ সাপোর্ট করে না)।
সারসংক্ষেপ
SQL ইনডেক্স একটি শক্তিশালী টুল যা সঠিকভাবে ব্যবহার করলে ডাটাবেস পারফরম্যান্সকে ১০০ গুণ পর্যন্ত উন্নত করতে পারে। তবে এটি অন্ধভাবে ব্যবহার না করে বোঝা জরুরি যে কোন পরিস্থিতিতে ইনডেক্স কার্যকর, আর কোনটিতে এটি কেবল ওভারহেড তৈরি করে। আপনার ডাটাবেসের কাজের চাপ (workload) বিশ্লেষণ করুন, EXPLAIN প্ল্যান দেখুন, এবং প্রয়োজন অনুযায়ী ইনডেক্স তৈরি ও অপসারণ করুন। একটি ভালো ইনডেক্স স্ট্রাটেজি আপনার অ্যাপ্লিকেশনকে দ্রুত, স্কেলেবল এবং ব্যবহারকারীর জন্য আরও প্রতিক্রিয়াশীল করে তুলবে।