> For the complete documentation index, see [llms.txt](https://mominur.gitbook.io/mominur-notes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://mominur.gitbook.io/mominur-notes/system-design/databases/indexing.md).

# Indexing

### **Indexing কী এবং কেন প্রয়োজন?**

ধরো, তুমি একটা বিশাল লাইব্রেরিতে গিয়েছো যেখানে লাখ লাখ বই আছে। এখন, তুমি যদি একটা নির্দিষ্ট বই খুঁজতে যাও, তাহলে কী পুরো লাইব্রেরির সব শেলফ একে একে দেখতে হবে? না, তুমি **Index** (সূচিপত্র) ব্যবহার করবে, যেখানে বইয়ের নাম, লেখকের নাম, আর অবস্থান দেওয়া থাকবে। **Database Indexing**-এর কাজও ঠিক একই রকম!

Software development-এ যখন **System Design** করা হয়, তখন **Indexing** ব্যবহার করা হয় **database queries** দ্রুত চালানোর জন্য। **Indexing** হলো এক ধরনের **data structure**, যা database-এ নির্দিষ্ট কলামের উপর তৈরি করা হয়, যাতে **search, retrieval, sorting, filtering** আরও দ্রুত করা যায়।

***

### **Indexing-এর কাজ কীভাবে হয়?**

ধরা যাক, তোমার কাছে ১০ মিলিয়ন রেকর্ড আছে একটা টেবিলে। তুমি যদি একটা **query** চালাও—

```sql
SELECT * FROM students WHERE student_id = 12345;
```

এখন, যদি **index** না থাকে, তাহলে **database engine** পুরো টেবিল স্ক্যান করবে (**Full Table Scan**), যা অনেক ধীরগতির। কিন্তু যদি **student\_id** কলামের উপর **index** থাকে, তাহলে database সরাসরি **indexed data structure**-এ গিয়ে খুব দ্রুত রেকর্ড বের করে আনতে পারবে।

***

### **Index-এর ধরনগুলো**

**Primary Index**\
প্রত্যেক টেবিলের **Primary Key**-তে **automatic index** থাকে, যেটা ইউনিক এবং **clustered** হয়।

**Clustered Index**\
ডাটা টেবিলের **actual order** অনুযায়ী সাজানো থাকে। প্রতিটি টেবিলে শুধু **একটা clustered index** থাকতে পারে।

**Non-clustered Index**\
এটা মূল ডাটার কপির উপর তৈরি হয় এবং মূল টেবিলের সাথে লিংক থাকে। একাধিক **non-clustered index** ব্যবহার করা যায়।

**Composite Index**\
একাধিক কলামের উপর **একই index** তৈরি করা হয়। যেমন—

```sql
CREATE INDEX idx_name ON students (first_name, last_name);
```

**Full-Text Index**\
যখন **text search** (যেমন: Google-এর মতো) দরকার হয়, তখন **full-text index** ব্যবহৃত হয়।

***

### **Index ব্যবহার করলে কী কী সুবিধা পাওয়া যায়?**

✔ **Query Performance বাড়ে** – দ্রুত রেকর্ড খুঁজে পাওয়া যায়।\
✔ **Sorting দ্রুত হয়** – অর্ডার করে ডাটা বের করা সহজ হয়।\
✔ **Joins দ্রুত কাজ করে** – বড় বড় টেবিল **join** করলেও পারফরম্যান্স ভালো থাকে।

***

### **Index ব্যবহারের কিছু সতর্কতা**

❌ **Index বেশি হলে Database ধীর হতে পারে** – প্রতিবার **INSERT, UPDATE, DELETE** হলে index-ও আপডেট হয়, যা অতিরিক্ত সময় নেয়।\
❌ **সঠিক Column-এ Index তৈরি করা দরকার** – সব কলামে index বানালে পারফরম্যান্স খারাপ হতে পারে।

***

### **Index কীভাবে ব্যবহার করা উচিত?**

✔ সেই কলামে Index তৈরি করো, যেটা Query-তে বেশি ব্যবহার হয়।\
✔ Primary Key সবসময় Indexed থাকে, তাই আলাদা বানানোর দরকার নেই।\
✔ Low-cardinality (যেমন Male/Female) এর উপর Index না বানানো ভালো।\
✔ Query Execution Plan ব্যবহার করে Performance Analyze করো।

***

Indexing software development-এ **system design**-এর খুবই গুরুত্বপূর্ণ অংশ। এটি সঠিকভাবে ব্যবহার করলে **query performance** অনেক দ্রুত হয় এবং পুরো **system efficiency** বাড়ে। তবে **Index** ভুলভাবে ব্যবহার করলে **performance degradation** হতে পারে। তাই বুঝেশুনে **Indexing Strategy** ব্যবহার করা উচিত।&#x20;
