Thêm, điều chỉnh hay xóa index là một phần quan trọng trong công việc phát triển các ứng dụng sử dụng database. Đối với các kiểu dữ liệu phức tạp trên Postgres như JSONB, array types, full text search, một index B-Tree đơn giản sẽ không hoạt động tốt bằng GIN index.
GIN index đã được thêm vào Postgres từ phiên bản 8.2 cách đây … 15 năm và trở thành một công cụ vô cùng quan trọng tới ngày nay. GIN index có thể giúp ta lập chỉ mục (index) với những thứ mà một B-Tree thông thường không thể như JSONB hoặc full text search. Tuy nhiên GIN index cũng có thể gây ra những tác dụng phụ nếu sử dụng không đúng cách.
Trong bài viết này, chúng ta sẽ cùng đi sâu vào tìm hiểu GIN index trong Postgres, cách xây dựng, và cũng tham khảo thêm từ nhiều bài viết khác đã được viết trong nhiều năm qua bởi cộng đồng.
Chúng ta sẽ bắt đầu từ việc xem xét GIN index có thể làm gì, cấu trúc của chúng, và những tính huống hay được sử dụng thông thường. Sau đó ta sẽ xem xét một tình huống thực tế tới từ Gitlab, liên quan tới GIN index trên một table với hơn 1000 update mỗi phút. Và cuối cùng, ta sẽ xem xét sự cân bằng giữa chi phí dành cho GIN và hiệu suất của nó.
“The GIN index type was designed to deal with data types that are subdividable and you want to search for individual component values (array elements, lexemes in a text document, etc)” - Tom Lane
GIN index ban đầu được tạo ra bởi Teodor Sigaev và Oleg Bartunov, được phát hành lần đầu tiên trong Postgres 8.2, vào ngày 5 tháng 12 năm 2006 - gần 15 năm trước. Kể từ đó, GIN đã có nhiều cải tiến, nhưng cấu trúc cơ bản vẫn tương tự.
GIN là viết tắt của cụm từ “Generalized Inverted Index”. Từ “Inverted” ở đây liên quan tới cấu trúc của index, là cách xây dựng một table-encompassing tree, mà trong đó một single row có thể được biểu diễn ở nhiều vị trí trong cây. Điều này trái ngược với B-Tree, một index entry sẽ trỏ đến một row cụ thể.
Một bài viết khác giải thích về GIN index bởi Oleg Bartunov và Alexander Korotkov tại PGConf 2012 tại Prague. Trong bài này, họ đã mô tả GIN index như là một mục lục trong cuốn sách. Trong đó, con trỏ chính là số trang!
Nhiều entry có thể được kết hợp lại cho một kết quả như ví dụ sau đây: