PostgreSQL có nhiều loại index, mỗi loại hợp với một kiểu dữ liệu/truy vấn:
- B-tree (mặc định): tốt cho so sánh bằng, khoảng (
<,>,BETWEEN) và sắp xếp trên giá trị thường (số, chuỗi, ngày). - GIN: cho dữ liệu "nhiều giá trị trong một ô" như JSONB, mảng, full-text search — kiểu "index ngược".
- GiST: cho dữ liệu hình học, khoảng, hoặc toán tử tùy biến (vị trí địa lý, range).
- BRIN: cho bảng cực lớn mà dữ liệu sắp xếp tự nhiên theo thứ tự ghi, ví dụ log/timestamp chỉ thêm vào cuối — index rất nhỏ và rẻ.
Ví dụ GIN cho cột JSONB:
sql
CREATE INDEX idx_events_payload_gin ON events USING gin (payload);Chọn theo kiểu toán tử/truy vấn thực tế, đừng chọn vì tên nghe "mạnh" hơn.