Indexing — Performance

লেসন ২৫ / ৩৯

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

PRIMARYUNIQUEINDEX
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" ⭐