PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

PostgreSQL LIKE các biến thể hiệu suất truy vấn

FTS không hỗ trợ LIKE

Câu trả lời được chấp nhận trước đó là không chính xác. Tìm kiếm Văn bản đầy đủ với các chỉ mục văn bản đầy đủ của nó không cho LIKE hoàn toàn, nó có các toán tử riêng và không hoạt động đối với các chuỗi tùy ý. Nó hoạt động dựa trên từ dựa trên từ điển và gốc. Nó không hỗ trợ đối sánh tiền tố cho các từ , nhưng không phải với LIKE nhà điều hành:

  • Nhận đối sánh từng phần từ cột TSVECTOR được lập chỉ mục GIN

Các chỉ mục Trigram cho LIKE

Cài đặt mô-đun bổ sung pg_trgm cung cấp các lớp toán tử cho các chỉ mục GIN và GiST trigram để hỗ trợ tất cả LIKEILIKE các mẫu , không chỉ những cái được neo bên trái:

Chỉ mục mẫu:

CREATE INDEX tbl_col_gin_trgm_idx  ON tbl USING gin  (col gin_trgm_ops);

Hoặc:

CREATE INDEX tbl_col_gist_trgm_idx ON tbl USING gist (col gist_trgm_ops);
  • Sự khác biệt giữa chỉ số GiST và GIN

Truy vấn mẫu:

SELECT * FROM tbl WHERE col LIKE '%foo%';   -- leading wildcard
SELECT * FROM tbl WHERE col ILIKE '%foo%';  -- works case insensitively as well

Hình bát quái? Còn đối với các chuỗi ngắn hơn thì sao?

Các từ có ít hơn 3 chữ cái trong các giá trị được lập chỉ mục vẫn hoạt động. Hướng dẫn sử dụng:

Mỗi từ được coi là có hai dấu cách được đặt trước và một dấu cách được gắn thêm dấu cách khi xác định bộ bát quái có trong chuỗi.

Và các mẫu tìm kiếm có ít hơn 3 chữ cái? Hướng dẫn sử dụng:

Đối với cả LIKE và tìm kiếm biểu thức chính quy, hãy nhớ rằng apattern không có bát quái có thể trích xuất sẽ chuyển thành quét toàn bộ chỉ mục.

Có nghĩa là, việc quét chỉ mục index / bitmap vẫn hoạt động (các kế hoạch truy vấn cho câu lệnh đã chuẩn bị sẽ không bị hỏng), nó chỉ không giúp bạn có được hiệu suất tốt hơn. Thông thường, không có tổn thất lớn nào, vì các chuỗi 1 hoặc 2 chữ cái hầu như không được chọn lọc (hơn một vài phần trăm các kết quả phù hợp với bảng bên dưới) và hỗ trợ chỉ mục sẽ không cải thiện hiệu suất ngay từ đầu, vì quá trình quét toàn bộ bảng nhanh hơn.


text_pattern_ops để đối sánh tiền tố

Chỉ đối với cố định bên trái các mẫu (không có ký tự đại diện đứng đầu) bạn nhận được tối ưu với lớp toán tử phù hợp cho chỉ mục btree:text_pattern_ops hoặc varchar_pattern_ops . Cả hai tính năng tích hợp của Postgres tiêu chuẩn, không cần mô-đun bổ sung. Hiệu suất tương tự, nhưng chỉ số nhỏ hơn nhiều.

Chỉ mục mẫu:

CREATE INDEX tbl_col_text_pattern_ops_idx ON tbl(col text_pattern_ops);

Truy vấn mẫu:

SELECT * FROM tbl WHERE col LIKE 'foo%';  -- no leading wildcard

Hoặc , nếu bạn đang chạy cơ sở dữ liệu của mình với 'C' ngôn ngữ (có hiệu quả là không ngôn ngữ), thì mọi thứ vẫn được sắp xếp theo thứ tự byte và chỉ mục btree thuần túy với lớp toán tử mặc định sẽ thực hiện công việc.

Thêm chi tiết, giải thích, ví dụ và liên kết trong các câu trả lời liên quan này trên dba.SE:

  • Đối sánh mẫu với LIKE, SIMILAR TO hoặc biểu thức chính quy trong PostgreSQL
  • LIKE được triển khai như thế nào?
  • Tìm các chuỗi tương tự với PostgreSQL một cách nhanh chóng


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tạo cơ sở dữ liệu Postgres bằng python

  2. Các chế độ xem PostgreSQL security_barrier hoạt động như thế nào?

  3. Lỗi khi tạo cơ sở dữ liệu không gian. LỖI:không thể tải thư viện /usr/pgsql-9.1/lib/rtpostgis-2.0.so

  4. Kết quả trả về PostgreSQL được đặt dưới dạng mảng JSON?

  5. Giám sát cơ sở dữ liệu PostgreSQL:Mẹo để giám sát những gì