ডেটাবেজ Index কী?
Index হলো ডেটাবেজের একটি বিশেষ ডেটা স্ট্রাকচার যা টেবিলের নির্দিষ্ট কলামের উপর তৈরি করা হয়। এটি বইয়ের সূচিপত্রের মতো কাজ করে — সম্পূর্ণ টেবিল স্ক্যান না করেই দ্রুত ডেটা খুঁজে পাওয়া সম্ভব হয়।
Index ছাড়া একটি query সম্পূর্ণ টেবিল স্ক্যান করে (Full Table Scan), যা লক্ষ লক্ষ রেকর্ডের ক্ষেত্রে অত্যন্ত ধীর হয়ে যায়। Index থাকলে ডেটাবেজ সরাসরি সঠিক রেকর্ডে পৌঁছাতে পারে।
Index কেন ব্যবহার করবেন?
- দ্রুত Query: SELECT query অনেক দ্রুত হয়
- Sorting দ্রুত: ORDER BY ক্লজে উপকার পাওয়া যায়
- JOIN Performance: টেবিল Join দ্রুত হয়
- Unique Constraint: Duplicate ডেটা প্রতিরোধ করতে পারে
ট্রেড-অফ:
- INSERT, UPDATE, DELETE ধীর হয় (Index আপডেট করতে হয়)
- অতিরিক্ত স্টোরেজ প্রয়োজন হয়
Index-এর ধরন
১. Single Column Index
একটি কলামের উপর Index:
-- সাধারণ Index তৈরি
CREATE INDEX idx_employee_name ON employees(name);
-- Unique Index তৈরি (duplicate অনুমতি নেই)
CREATE UNIQUE INDEX idx_employee_email ON employees(email);
২. Composite Index (বহু কলাম)
একাধিক কলামের উপর একটি Index:
CREATE INDEX idx_emp_dept_name ON employees(department_id, name);
৩. Primary Key Index
Primary Key স্বয়ংক্রিয়ভাবে Clustered Index তৈরি করে:
CREATE TABLE employees (
id BIGINT PRIMARY KEY, -- স্বয়ংক্রিয়ভাবে Index তৈরি হয়
name VARCHAR(100),
email VARCHAR(100) UNIQUE -- Unique Index তৈরি করে
);
৪. Full-Text Index
টেক্সট সার্চের জন্য:
CREATE FULLTEXT INDEX idx_article_content ON articles(content);
-- Full-text search করতে
SELECT * FROM articles WHERE MATCH(content) AGAINST('java spring' IN BOOLEAN MODE);
Index কিভাবে কাজ করে?
MySQL এবং PostgreSQL সাধারণত B-Tree স্ট্রাকচার ব্যবহার করে Index সংরক্ষণ করে। B-Tree হলো একটি Balanced Tree যেখানে প্রতিটি নোড সর্টেড ক্রমে থাকে।
উদাহরণ:
employeesটেবিলে ১০ লক্ষ রেকর্ড আছে- Index ছাড়া:
WHERE email = 'abc@test.com'→ ১০ লক্ষ রেকর্ড স্ক্যান - Index সহ: সরাসরি সঠিক Row-এ পৌঁছানো → মিলিসেকেন্ডে ফলাফল
Spring Data JPA-তে Index
@Table Annotation দিয়ে Index
import jakarta.persistence.*;
@Entity
@Table(
name = "employees",
indexes = {
@Index(name = "idx_emp_email", columnList = "email", unique = true),
@Index(name = "idx_emp_dept_name", columnList = "department_id, name"),
@Index(name = "idx_emp_name", columnList = "name")
}
)
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name", nullable = false)
private String name;
@Column(name = "email", unique = true)
private String email;
@Column(name = "department_id")
private Long departmentId;
@Column(name = "salary")
private Double salary;
// Getters and Setters
}
Repository Query ব্যবহার
@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
// Index থাকায় এই query দ্রুত চলবে
Optional<Employee> findByEmail(String email);
// Composite index ব্যবহার করবে
List<Employee> findByDepartmentIdAndName(Long departmentId, String name);
// Index সহ সার্চ
@Query("SELECT e FROM Employee e WHERE e.name LIKE :name%")
List<Employee> searchByNamePrefix(@Param("name") String name);
}
Index ব্যবহারের সঠিক কৌশল
কোথায় Index দেবেন?
-- ভালো Index প্রার্থী
WHERE clause-এ বেশি ব্যবহৃত কলাম
JOIN condition-এ ব্যবহৃত কলাম
ORDER BY বা GROUP BY কলাম
High Cardinality কলাম (অনেক unique মান)
-- খারাপ Index প্রার্থী
কম unique মানযুক্ত কলাম (যেমন: gender: M/F)
খুব কম রেকর্ডের ছোট টেবিল
বেশি INSERT/UPDATE হওয়া কলাম
EXPLAIN দিয়ে Index যাচাই
-- Query Plan দেখুন
EXPLAIN SELECT * FROM employees WHERE email = 'test@test.com';
-- Output এ 'Using index' দেখালে Index ব্যবহার হচ্ছে
-- 'Full table scan' দেখালে Index নেই বা ব্যবহার হচ্ছে না
Index-এর সীমাবদ্ধতা
Over-indexing এড়িয়ে চলুন
-- খারাপ উদাহরণ: প্রতিটি কলামে Index
CREATE INDEX idx1 ON orders(customer_id);
CREATE INDEX idx2 ON orders(product_id);
CREATE INDEX idx3 ON orders(status);
CREATE INDEX idx4 ON orders(created_at);
CREATE INDEX idx5 ON orders(total_price);
-- এতে INSERT/UPDATE অনেক ধীর হবে!
-- ভালো উদাহরণ: সবচেয়ে বেশি ব্যবহৃত query বিশ্লেষণ করে Composite Index
CREATE INDEX idx_orders_customer_status ON orders(customer_id, status);
সংক্ষেপে
| বিষয় | বিবরণ |
|---|---|
| Index কী | ডেটা দ্রুত খোঁজার জন্য বিশেষ ডেটা স্ট্রাকচার |
| সুবিধা | SELECT query অনেক দ্রুত হয় |
| অসুবিধা | INSERT/UPDATE ধীর, বেশি স্টোরেজ |
| B-Tree | সবচেয়ে সাধারণ Index ধরন |
@Index |
JPA-তে Entity-তে Index যোগ করার Annotation |
| EXPLAIN | Index ব্যবহার হচ্ছে কিনা যাচাই করার টুল |
উপসংহার
Database Index সঠিকভাবে ব্যবহার করলে অ্যাপ্লিকেশনের performance অনেক গুণ বেড়ে যায়। তবে Index যোগ করার আগে Query Pattern বিশ্লেষণ করা উচিত। EXPLAIN কমান্ড ব্যবহার করে Index কার্যকর কিনা যাচাই করুন এবং Over-indexing থেকে বিরত থাকুন।