← Tất cả bài viết

Index trong PostgreSQL: khi nào nên tạo và khi nào không

22/07/2026

Index là cấu trúc phụ giúp database tìm dòng nhanh mà không phải quét cả bảng. Nhưng index không miễn phí — mỗi index làm chậm INSERT/UPDATE và tốn dung lượng. Nghệ thuật là tạo đúng chỗ.

Khi nào NÊN tạo index

  • Cột thường xuất hiện trong WHERE, JOIN ON, ORDER BY
  • Khoá ngoại — PostgreSQL không tự tạo index cho FK, phải tạo tay để JOIN và xoá cascade nhanh
  • Cột có tính chọn lọc cao (nhiều giá trị khác nhau), ví dụ email, mã đơn

Khi nào KHÔNG cần

  • Bảng nhỏ (vài trăm dòng) — quét toàn bảng còn nhanh hơn đọc index
  • Cột chọn lọc thấp như cột boolean (chỉ 2 giá trị) — index ít tác dụng
  • Bảng ghi nhiều đọc ít — mỗi index thêm chi phí cho mọi lần ghi

Composite index và thứ tự cột

Index nhiều cột (a, b) phục vụ được truy vấn lọc theo a hoặc a AND b, nhưng KHÔNG phục vụ tốt truy vấn chỉ lọc theo b. Đặt cột lọc phổ biến/chọn lọc cao lên trước.

CREATE INDEX idx_orders_user_created
  ON orders (user_id, created_at DESC);

Sau khi tạo, luôn kiểm chứng bằng EXPLAIN ANALYZE xem query có thực sự dùng index không.

👉 Dùng thử công cụ liên quan trên dev-hub: SQL Formatter — chạy hoàn toàn trong trình duyệt, không gửi dữ liệu lên server.