Hai chỉ mục khác của bạn sẽ không hoạt động chỉ vì ->>
toán tử trả về text
, trong khi rõ ràng bạn có jsonb
các lớp toán tử gin trong tâm trí. Lưu ý rằng bạn chỉ đề cập đến json
, nhưng bạn thực sự cần jsonb
để có khả năng lập chỉ mục nâng cao.
Để tìm ra chiến lược lập chỉ mục tốt nhất, bạn phải xác định kỹ hơn những truy vấn nào cần bao gồm. Bạn chỉ quan tâm đến những con bò? Hoặc tất cả các động vật / tất cả các thẻ? Các toán tử nào có thể? Tài liệu JSON của bạn có bao gồm các khóa không phải là động vật không? Làm gì với những cái đó? Bạn có muốn đưa các hàng vào chỉ mục mà các con bò (hoặc bất cứ thứ gì) hoàn toàn không hiển thị trong tài liệu JSON không?
Giả sử:
- Chúng tôi chỉ quan tâm đến những con bò ở cấp độ làm tổ đầu tiên.
- Giá trị luôn là một số nguyên
- Chúng tôi không quan tâm đến các hàng không có bò.
Tôi đề xuất một chỉ mục btree chức năng, giống như bạn đã có, nhưng truyền giá trị thành số nguyên
. Tôi không cho rằng bạn muốn so sánh được đánh giá là text
(trong đó '2' lớn hơn '1111').
TẠO INDEX animal_index TRÊN trang trại (((động vật ->> 'bò') ::int)); -!
Cần có thêm tập hợp các dấu ngoặc đơn cho phép viết tắt truyền để làm cho cú pháp của biểu thức chỉ mục trở nên rõ ràng.
Sử dụng cùng một biểu thức trong các truy vấn của bạn để làm cho Postgres nhận ra rằng chỉ mục này có thể áp dụng được:
CHỌN * TỪ trang trại WHERE (động vật ->> 'bò') ::int> 3;
Nếu bạn cần một jsonb
chung chung hơn chỉ mục, xem xét:
- Chỉ mục thích hợp để truy vấn cấu trúc trong mảng trong Postgres jsonb là gì?
Đối với một đã biết, tĩnh, tầm thường số lượng động vật (như bạn đã nhận xét), tôi đề xuất các chỉ mục một phần như:
« ->> 'gà') ::int)) WHERE (động vật ->> 'gà') KHÔNG ĐẦY ĐỦ;Vv.
Bạn có thể phải thêm điều kiện chỉ mục vào truy vấn:
SELECT * FROM farmWHERE (súc vật ->> 'con bò') ::int> 3AND (con vật ->> 'con bò') KHÔNG ĐỦ;
Có thể có vẻ thừa, nhưng có thể cần thiết. Kiểm tra với ANALYZE
!