PostgreSQL hỗ trợ nhiều loại index cho các bài toán khác nhau:
- B-tree (mặc định): so sánh có thứ tự (
=,<,>,BETWEEN,ORDER BY) — hợp hầu hết trường hợp. - Hash: chỉ cho
=(bằng đúng); ít dùng vì B-tree đã bao gần hết. - GIN (Generalized Inverted Index): cho giá trị hợp thành nhiều phần tử — mảng,
jsonb, và full-text search (tsvector). Truy vấn "chứa" (@>), có phần tử. - GiST: cho dữ liệu hình học/khoảng/gần đúng — geometry, range type, tìm lân cận (KNN).
- BRIN (Block Range Index): rất nhỏ gọn, hợp bảng lớn và có tương quan vật lý (dữ liệu ghi tăng dần theo thời gian, vd log theo timestamp) — index cực nhẹ, đổi lại kém chính xác hơn.
- SP-GiST: dữ liệu phân vùng không cân bằng (quadtree, trie).
Chọn theo kiểu dữ liệu + toán tử truy vấn. Mặc định B-tree; JSONB/mảng/full-text → GIN; không gian/range → GiST; bảng thời gian khổng lồ → cân nhắc BRIN.
Đáng nhớ thêm hai biến thể: expression index (CREATE INDEX ON t (lower(email)) — khi truy vấn luôn bọc hàm quanh cột) và partial index (CREATE INDEX ... WHERE status = 'pending' — nhỏ, cập nhật nhanh, rất hiệu quả khi truy vấn luôn lọc một điều kiện cố định).