Indexing & Performance

Why Indexes Matter

-- Without index: Full table scan (slow on large tables)
SELECT * FROM orders WHERE user_id = 12345;
-- → MySQL scans every row

-- With index: B-tree lookup (fast)
CREATE INDEX idx_user_id ON orders(user_id);
-- → MySQL jumps directly to matching rows

Index Types

-- Single column index
CREATE INDEX idx_email ON users(email);

-- Composite index (order matters!)
CREATE INDEX idx_user_date ON orders(user_id, created_at);
-- ✅ Efficient: WHERE user_id = 1 AND created_at > '2026-01-01'
-- ✅ Efficient: WHERE user_id = 1
-- ❌ Inefficient: WHERE created_at > '2026-01-01' (missing leading column)

-- Unique index
CREATE UNIQUE INDEX idx_unique_email ON users(email);

-- Partial index (PostgreSQL)
CREATE INDEX idx_active_users ON users(email) WHERE status = 'active';

EXPLAIN — Analyze Query Performance

Common Performance Issues

Last updated