Postgres có thể sử dụng các cột không đứng đầu trong chỉ mục b-tree, nhưng ở chế độ kém hiệu quả hơn nhiều.
Nếu cột đầu tiên rất chọn lọc (chỉ vài hàng cho mỗi A
) thì bạn sẽ khó nhận thấy sự khác biệt về hiệu suất vì cả hai phương pháp truy cập (thậm chí là quét tuần tự trên tập hợp đã giảm) là rẻ. Lần truy cập hiệu suất tăng lên với số lượng hàng trên mỗi A
.
Đối với trường hợp bạn mô tả, tôi khuyên bạn nên tạo chỉ mục trên (A, C, B)
hoặc (C, A, B)
(chỉ cần đảm bảo rằng B
đến cuối cùng) để tối ưu hóa hiệu suất. Bằng cách này, bạn có được hiệu suất tốt nhất cho các truy vấn trên (A, B, C)
và trên (A, C)
giống nhau.
Không giống như chuỗi các cột trong chỉ mục, chuỗi các vị từ trong truy vấn không quan trọng.
Chúng tôi đã thảo luận rất chi tiết về vấn đề này trên dba.SE:
Lưu ý rằng nó không vấn đề cho dù bạn dẫn đầu bằng A, C
hoặc C, A
đối với trường hợp trong tay:
Ngoài ra còn có một số cân nhắc khác, nhưng câu hỏi của bạn không có tất cả các chi tiết liên quan.