TIN: Giải pháp tìm kiếm toàn văn mới cho Postgres nhanh gấp 8 lần

Công nghệ19 tháng 9, 2026·5 phút đọc

PlanetScale vừa ra mắt TIN — extension tìm kiếm toàn văn cho Postgres với hiệu năng vượt trội, nhanh hơn ít nhất 8 lần so với các giải pháp hiện có như ParadeDB và GIN. Điểm đột phá nằm ở việc sử dụng trực tiếp ctid của Postgres làm định danh tài liệu, kết hợp bitmap nhiều tầng và vector hóa AVX để tối ưu truy vấn.

TIN: Giải pháp tìm kiếm toàn văn mới cho Postgres nhanh gấp 8 lần

PlanetScale vừa chính thức ra mắt TIN (viết tắt của "Text INdex") — một extension tìm kiếm toàn văn (full-text search) dành cho Postgres, hứa hẹn mang lại hiệu năng vượt trội so với các giải pháp hiện có trên thị trường.

Đây là một bổ sung đáng chú ý cho cộng đồng Postgres, vốn từ lâu vẫn thiếu một công cụ tìm kiếm toàn văn vừa mạnh mẽ vừa dễ tích hợp.

TIN là gì và giải quyết vấn đề gì?

Theo nhóm phát triển tại PlanetScale, tìm kiếm toàn văn là một trong những tính năng được khách hàng yêu cầu nhiều nhất. Mặc dù Postgres đã có ít nhất ba loại index tìm kiếm văn bản, nhưng không giải pháp nào đáp ứng đầy đủ các yêu cầu thực tế.

Một index văn bản tốt cần hỗ trợ:

  • Biểu thức Boolean, truy vấn cụm từ (phrase query) và truy vấn khoảng (span query)
  • Khớp mờ (fuzzy), ký tự đại diện (wildcard) và biểu thức chính quy (regex)
  • Chuẩn hóa chữ hoa/thường và dấu (case and accent folding)
  • Truy vấn đếm COUNT(*) và truy vấn top-k theo điểm BM25

Quan trọng hơn, công cụ này phải hoạt động trơn tru trong môi trường Postgres thực tế — nơi có join, mệnh đề WHERE phức tạp, cập nhật liên tục, replication, backup và tính nhất quán giao dịch (transaction visibility).

"Mặc dù đã có ít nhất ba loại index tìm kiếm văn bản cho Postgres, không loại nào đáp ứng được tất cả các yêu cầu đó. TIN thì có."

Cách sử dụng rất đơn giản:

CREATE INDEX an_index_name ON table_name USING tin(text_column_name);

SELECT * FROM table_name
WHERE text_column_name ==> 'some words';

TIN hiện đã ở trạng thái GA (Generally Available) cho tất cả các cơ sở dữ liệu Postgres và Neki.

Hiệu năng vượt trội qua các bài benchmark

Nhóm phát triển đã chạy benchmark trên nhiều bộ dữ liệu lớn, bao gồm toàn bộ Wikipedia, 2,3 TB bình luận Reddit, và bộ dữ liệu "pile" 797 GB gồm bài báo nghiên cứu, tài liệu pháp lý, sách và email Enron.

Kết quả công bố sử dụng bộ dữ liệu Stack Exchange (85 GB, 150 triệu tài liệu) với 1.719 truy vấn tổng hợp, chạy trên instance AWS i7i.8xlarge giới hạn 8 vCPU và 32 GB RAM.

Kết quả nổi bật:

  • Truy vấn hỗn hợp top-10: TIN đạt 25 lần số truy vấn/giây so với ParadeDB, với độ trễ p99 thấp hơn 26 lần
  • Truy vấn hội (conjunction) và cụm từ: TIN nhanh hơn ParadeDB 10 lần và nhanh hơn GIN tới 541 lần
  • Truy vấn tuyển (disjunction) với ghi đồng thời: TIN xử lý gấp 36 lần pg_textsearch và 57 lần ParadeDB, với p99 thấp hơn 24–36 lần
  • Khi index nằm hoàn toàn trong bộ nhớ: Truy vấn đếm trên Wikipedia đạt 10.260 QPS với p99 chỉ 2ms — nhanh gấp 35 lần ParadeDB

Đáng chú ý, TIN đọc dữ liệu từ đĩa ít hơn đáng kể (chỉ 1,7 MB/truy vấn so với 22 MB của ParadeDB trong bài test Wikipedia), giúp giảm tải cho block cache và I/O — đồng nghĩa các truy vấn khác trên cùng server vẫn chạy nhanh.

Bí quyết đằng sau tốc độ của TIN

Điểm then chốt trong kiến trúc của TIN là việc sử dụng trực tiếp ctid (current tuple identifier) của Postgres làm định danh tài liệu, thay vì dùng số thứ tự tuần tự như các hệ thống khác.

ctid là gì? Mỗi phiên bản của mỗi hàng trong bảng Postgres đều có một giá trị ctid — số 48 bit xác định trực tiếp vị trí vật lý của tuple trong heap. 32 bit trên là số trang, 16 bit dưới là offset trong trang đó.

Các hệ thống tìm kiếm khác như ParadeDB và pg_textsearch phải duy trì một cấu trúc dữ liệu riêng để ánh xạ từ định danh tuần tự sang ctid. Với 10 triệu kết quả khớp, họ phải tra cứu 10 triệu lần. TIN loại bỏ hoàn toàn bước này.

Bitmap hai tầng: Vì ctid là số 48 bit không liên tục, các kỹ thuật nén thông thường không hiệu quả. TIN giải quyết bằng bitmap hai tầng: bitmap cấp trang (256 bit, vừa khít một thanh ghi AVX2) và bitmap cấp offset nhỏ hơn cho từng trang.

Vector hóa: Mọi bitmap cấp trang đều vừa một thanh ghi AVX2, bitmap cấp offset vừa một thanh ghi AVX-512 hoặc hai AVX2. Các phép AND/OR của truy vấn trở thành lệnh vector đơn thuần, còn đếm kết quả dùng lệnh POPCNT gốc của CPU.

MVCC và tính nhất quán: TIN đảm bảo kết quả đúng theo MVCC. Với truy vấn đếm, nếu mọi trang đều được đánh dấu all-visible, TIN trả kết quả mà không cần chạm vào heap. TIN còn tích hợp visibility map của Postgres trực tiếp vào bitmap cấp trang.

Gộp segment không cần đánh số lại: Vì dùng ctid, khi gộp các segment, TIN không cần đánh số lại tài liệu — một vấn đề gây write amplification lớn ở các hệ thống khác. Bitmap từ segment cũ có thể tái sử dụng nguyên vẹn.

Ý nghĩa với cộng đồng Postgres

Sự ra đời của TIN đánh dấu bước tiến quan trọng cho hệ sinh thái Postgres — vốn đang ngày càng được các startup và doanh nghiệp Việt Nam ưa chuộng nhờ tính mã nguồn mở và chi phí hợp lý.

Với TIN, các đội phát triển có thể xây dựng tính năng tìm kiếm ngay trong Postgres mà không cần thêm Elasticsearch hay một hệ thống tìm kiếm riêng biệt — giảm đáng kể độ phức tạp hạ tầng và chi phí vận hành.

Nhóm phát triển PlanetScale cho biết TIN hiện đã sẵn sàng để dùng thử, kèm tài liệu tính năng và hướng dẫn bắt đầu chi tiết.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗