- B-tree index: cấu trúc cây cân bằng, mỗi node chứa sorted keys và pointers — tìm kiếm O(log n) thay vì O(n) full scan.
- Bảng 10 triệu rows: full scan ~10s, B-tree index ~1ms.
- Covering index: index chứa TẤT CẢ columns cần cho query → database chỉ đọc index, không cần đọc table (Index Only Scan) —
CREATE INDEX idx_users_email_name ON users(email, name)coverSELECT name FROM users WHERE email = ?. - Partial index: index chỉ trên subset rows —
CREATE INDEX idx_active_users ON users(email) WHERE deleted_at IS NULLnhỏ hơn, nhanh hơn full index nếu query luôn cóWHERE deleted_at IS NULL. - Khi KHÔNG nên index: bảng < 1000 rows (full scan nhanh hơn), columns ít cardinality (boolean, status với 2-3 values), bảng write-heavy (mỗi write phải update tất cả indexes).
- Index maintenance: REINDEX để rebuild index bị bloated;
pg_stat_user_indexesxem index usage — drop indexes không được dùng.
Pitfall: function trên indexed column bypass index — WHERE LOWER(email) = ? không dùng index trên email; tạo functional index CREATE INDEX ON users(LOWER(email)) thay thế.