Index কী?
Index হলো ডেটা স্ট্রাকচার যা দ্রুত search সাহায্য করে। বইয়ের সূচিপত্র-এর মতো।
💡 Index ছাড়া: ১ কোটি row-এ full scan
Index সহ: মিলিসেকেন্ড
Index তৈরি
-- Single column
CREATE INDEX idx_email ON users(email);
-- Table তৈরির সময়
CREATE TABLE users (
id INT PRIMARY KEY,
email VARCHAR(150),
INDEX idx_email (email)
);
-- ALTER
ALTER TABLE users ADD INDEX idx_name (name);
-- Unique
CREATE UNIQUE INDEX idx_email ON users(email);
-- Composite ⭐
CREATE INDEX idx_city_age ON users(city, age);
-- ✅ WHERE city='ঢাকা'
-- ✅ WHERE city='ঢাকা' AND age=25
-- ❌ WHERE age=25 (city ছাড়া)
PK vs Unique vs Index
| PRIMARY | UNIQUE | INDEX | |
|---|---|---|---|
| NULL | না | হ্যাঁ | হ্যাঁ |
| ডুপ্লিকেট | না | না | হ্যাঁ |
| সংখ্যা | ১ | একাধিক | একাধিক |
Full-Text Index
CREATE TABLE articles (
id INT PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT(title, body)
);
SELECT * FROM articles
WHERE MATCH(title, body) AGAINST('বাংলাদেশ প্রযুক্তি');
-- Boolean mode
WHERE MATCH(title, body) AGAINST('+PHP -Java' IN BOOLEAN MODE);
Management
SHOW INDEXES FROM users; DROP INDEX idx_email ON users; OPTIMIZE TABLE users;
Index কখন কাজ করে?
-- ✅ WHERE email = '...' WHERE age > 25 WHERE name LIKE 'ক%' ORDER BY name JOIN ON users.id = ... -- ❌ WHERE YEAR(created_at) = 2025 -- function WHERE name LIKE '%ম%' -- leading wildcard WHERE age + 5 > 30 -- expression
EXPLAIN
EXPLAIN SELECT * FROM users WHERE email = 'k@mail.com'; -- type=ref, key=idx_email, rows=1 ✅ EXPLAIN SELECT * FROM users WHERE name = 'করিম'; -- type=ALL, key=NULL, rows=1000000 ❌
কখন Index না?
- ছোট table (< 1000 rows)
- বেশি INSERT/UPDATE
- Low cardinality (gender)
Best Practices
- WHERE, JOIN, ORDER BY-তে index
- Composite-এ selective column আগে
- অতিরিক্ত index INSERT ধীর করে
- EXPLAIN দিয়ে যাচাই
- FK column-এ সবসময় index
Covering Index
CREATE INDEX idx_cover ON users(city, name, email); -- Query-র সব column index-এ → table পড়তে হয় না EXPLAIN SELECT name, email FROM users WHERE city = 'ঢাকা'; -- "Using index" ⭐