Từ thông tin nào tôi có thể tìm thấy, cả hai đều giải quyết cùng một vấn đề - nhiều hoạt động bí truyền hơn như ngăn chặn mảng và giao lộ (& &, @>, < @, v.v.). Tuy nhiên tôi sẽ quan tâm đến lời khuyên khi nào nên sử dụng cái này hay cái kia (hoặc không thể).
Các PostgreSQL documentation có một số thông tin về vấn đề này:PostgreSQL: chỉ mục GIN hoặc GiST?
- index GIN tra cứu là nhanh hơn so với GIST
- chỉ số GIN khoảng ba lần mất khoảng ba lần thời gian để xây dựng hơn GIST
- chỉ số GIN là chậm hơn khoảng mười lần để cập nhật hơn GIST
- chỉ số GIN là hai-to-ba lớn hơn GIST
lần Tuy nhiên tôi sẽ đặc biệt i nterested để biết nếu có một tác động hiệu suất khi bộ nhớ để chỉ số kích thước khẩu phần bắt đầu nhận được nhỏ (tức là. kích thước chỉ mục trở nên lớn hơn nhiều so với bộ nhớ có sẵn)? Tôi đã được thông báo trên kênh IRC#postgresql mà GIN cần giữ tất cả chỉ mục trong bộ nhớ, nếu không nó sẽ không hiệu quả, bởi vì, không giống như B-Tree, nó không biết phần nào cần đọc từ đĩa một truy vấn cụ thể? Câu hỏi đặt ra là: điều này có đúng không (bởi vì tôi cũng đã được nói ngược lại về điều này)? Liệu GiST có cùng hạn chế không? Có những hạn chế nào khác mà tôi nên biết khi sử dụng một trong các thuật toán lập chỉ mục này không?
Các phép đo này thay đổi theo phiên bản PG bạn đang sử dụng. Tôi chỉ chạy thử nghiệm dưới 9.6.1 so với cột hstore và nhận được thông tin sau: GiST mất gấp 4,1 lần để xây dựng hơn GIN và chậm hơn khoảng 170 lần so với tra cứu. Thậm chí không gần với những con số bạn đã trích dẫn. – IamIC