Hướng dẫn cách cài đặt pg_trgm và tạo Trigram Index (GIN/GiST) cho một bảng trong PostgreSQL bằng câu lệnh SQL.
Để cài đặt và sử dụng Trigram Index trong PostgreSQL, bạn cần thực hiện hai bước chính: kích hoạt extension pg_trgm và tạo index trên cột mong muốn.
1. Kích hoạt module pg_trgm
Trước khi có thể tạo Trigram Index, bạn cần bật extension này cho database của mình. Lệnh này chỉ cần chạy một lần duy nhất.
SQL
CREATE EXTENSION IF NOT EXISTS pg_trgm;
2. Tạo Trigram Index (GIN hoặc GiST)
Khi tạo index, điều bắt buộc là bạn phải chỉ định operator class (gin_trgm_ops hoặc gist_trgm_ops) để PostgreSQL biết cần băm chuỗi thành các trigram thay vì sử dụng thuật toán B-Tree mặc định.
Tùy chọn 1: Sử dụng GIN Index (Khuyên dùng)
GIN (Generalized Inverted Index) mang lại tốc độ truy vấn (Read) nhanh nhất, đánh đổi lại là dung lượng lưu trữ lớn hơn và tốc độ ghi (Insert/Update) chậm hơn. Đây là lựa chọn tốt nhất cho các bảng dữ liệu ít bị thay đổi nhưng được tìm kiếm thường xuyên.
SQL
CREATE INDEX idx_table_column_gin
ON ten_bang
USING GIN (ten_cot gin_trgm_ops);
Tùy chọn 2: Sử dụng GiST Index
GiST (Generalized Search Tree) tốn ít bộ nhớ hơn và cho tốc độ cập nhật dữ liệu (Write) nhanh hơn GIN. Nó phù hợp với các bảng có tần suất Insert/Update liên tục, hoặc khi bạn cần tối ưu các truy vấn tìm kiếm độ tương đồng (Similarity Search) theo dạng nearest-neighbor.
SQL
CREATE INDEX idx_table_column_gist
ON ten_bang
USING GiST (ten_cot gist_trgm_ops);
3. Kiểm tra hiệu quả của Index
Sau khi tạo xong, bạn nên kiểm tra xem bộ tối ưu hóa truy vấn (Query Planner) của PostgreSQL có thực sự sử dụng index bạn vừa tạo hay không bằng lệnh EXPLAIN ANALYZE.
SQL
EXPLAIN ANALYZE
SELECT * FROM ten_bang
WHERE ten_cot ILIKE '%tu_khoa%';
Nếu trong kết quả trả về xuất hiện dòng chữ Bitmap Index Scan on idx_table_column_gin, điều đó chứng tỏ truy vấn của bạn đã bỏ qua Full Table Scan và đang tận dụng Trigram Index thành công.
Lưu ý: Nếu bảng của bạn có quá ít dữ liệu (vài trăm dòng), PostgreSQL có thể vẫn chọn Full Table Scan vì nó đánh giá việc quét trực tiếp trên bảng nhỏ sẽ nhanh hơn là đọc qua Index.
All rights reserved