-
Các chỉ mục thường vô dụng đối với các hoạt động trên 90% tất cả các hàng. Quét tuần tự sẽ nhanh hơn theo cả hai cách. (Áp dụng các trường hợp ngoại lệ.)
-
Nếu bạn cần cho phép đọc đồng thời, bạn không thể lấy một ổ khóa độc quyền trên bàn. Vì vậy, bạn cũng không thể bỏ bất kỳ chỉ mục nào trong cùng một giao dịch.
-
Bạn có thể giảm các chỉ mục trong các giao dịch riêng biệt để giữ cho thời hạn của khóa độc quyền ở mức tối thiểu. Trong Postgres 9.2 trở lên, bạn cũng có thể sử dụng CHỈ SỐ DROP NGAY LẬP TỨC , chỉ cần ổ khóa tối thiểu. Sau đó, hãy sử dụng
CREATE INDEX CONCURRENTLY
để xây dựng lại chỉ mục trong nền - và chỉ thực hiện một khóa độc quyền rất ngắn.
Nếu bạn có điều kiện ổn định để xác định 10% (hoặc ít hơn) hàng ở lại, tôi sẽ đề xuất chỉ mục một phần chỉ trên những hàng đó để có được điều tốt nhất cho cả hai:
- Đọc các truy vấn có thể truy cập bảng một cách nhanh chóng (sử dụng chỉ mục một phần) mọi lúc.
-
DELETE
lớn sẽ không sửa đổi chỉ mục từng phần, vì không có hàng nào liên quan đếnDELETE
.
CREATE INDEX foo (some_id) WHERE delete_flag = FALSE;
Giả sử delete_flag
là boolean
. Bạn phải bao gồm cùng một vị từ trong các truy vấn của mình (ngay cả khi nó có vẻ thừa về mặt logic) để đảm bảo Postgres có thể lập chỉ mục một phần.