2013-07-13 38 views
6

Tôi có cơ sở dữ liệu và muốn tìm kiếm trong bảng tìm kiếm giống như sau: chọn * từ bảng trong đó cột như "abc% def% write " hoặc chọn * từ bảng trong đó cột như"% def% ghi " Có cách nào để lập chỉ mục cột để điều này không quá chậm không?Có cách nào để lập chỉ mục trong postgres cho tìm kiếm chuỗi con ngắn

Chỉnh sửa: Tôi cũng có thể làm rõ rằng cơ sở dữ liệu chỉ đọc và sẽ không được cập nhật thường xuyên.

+0

tôi nghĩ rằng bạn cần một văn bản đầy đủ [ index] (http://www.postgresql.org/docs/8.3/static/textsearch.html) –

+0

Câu hỏi này phù hợp hơn cho http://dba.stackexchange.com/ –

Trả lời

2

Đối với việc sử dụng like điều hành một trong các lớp điều hành varchar_pattern_ops hoặc text_pattern_ops

create index test_index on test_table (col varchar_pattern_ops); 

Điều đó sẽ chỉ làm việc nếu mô hình không bắt đầu bằng một % trong trường hợp một chiến lược khác là bắt buộc.

+2

Nếu cần tìm kiếm toàn văn, [pg_trgm] (http://www.postgresql.org/docs/current/static/pgtrgm.html) có thể hoạt động. Tôi đã sử dụng nó trong quá khứ và nó hoạt động khá tốt trong những điều kiện nhất định. Cần lưu ý rằng các chỉ số nhận được khá lớn. IIRC, khoảng 2,5x kích thước của cột được lập chỉ mục. – bma

13

Tùy chọn cho tìm kiếm văn bản và lập chỉ mục bao gồm:

Từ thông tin tối thiểu được nêu ở trên, tôi muốn nói rằng chỉ một chỉ số trigram sẽ có thể giúp bạn, vì bạn đang thực hiện tìm kiếm trên chuỗi và không tìm kiếm từ điển. Thật không may, chỉ số trigram là lớn và thay vì không hiệu quả; không mong đợi một số loại tăng hiệu suất ma thuật, và ghi nhớ rằng họ mất rất nhiều công việc cho các công cụ cơ sở dữ liệu để xây dựng và giữ cho đến ngày.

1

Nếu bạn chỉ cần đến, ví dụ, có được chuỗi con duy nhất trong toàn bộ một bảng, bạn có thể tạo ra một chỉ số chuỗi:

CREATE INDEX i_test_sbstr ON tablename (substring(columname, 5, 3)); 
-- start at position 5, go for 3 characters 

It is important that the substring() parameters in the index definition are 
the same as you use in your query. 

ref: http://www.postgresql.org/message-id/[email protected]

Các vấn đề liên quan