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

Lập chỉ mục ando:Chỉ mục GIN

PostgreSQL có một số loại chỉ mục:B-tree, Hash, GiST, Gin và SP-GiST. Rõ ràng là mỗi người trong số họ bao gồm một nhu cầu cụ thể. Ví dụ:tài liệu PostgreSQL nói về chỉ mục GIN:

Vì vậy, các chỉ mục GIN có thể được sử dụng để lập chỉ mục các phần tử của một mảng, một hstore, v.v.

Nhưng lần này chúng ta sẽ nói về một trong những mô-đun đóng góp cung cấp nhiều loại toán tử hơn có thể được sử dụng với chỉ mục GIN:pg_trgm.

Mô-đun này tạo ra các chuỗi văn bản bát quái để nó có thể được sử dụng để tìm các điểm tương đồng. Điều này cho phép các chỉ mục giống GIN sử dụng lớp toán tử gin_trgm_ops được sử dụng trong các tìm kiếm LIKE ngay cả khi tìm thấy ký tự đại diện '%' ở đầu mẫu tìm kiếm (ví dụ:LIKE tên '% jaime%').

Để tạo một chỉ mục có thể được sử dụng như thế này, chỉ mục phải được tạo như sau:

CREATE INDEX idx_gin ON table USING GIN (campo_texto gin_trgm_ops);

Với một chỉ mục như thế này, tôi đã thấy các truy vấn giảm từ hơn 10 giây xuống còn vài mili giây; tuy nhiên, trước khi bạn vội vàng tạo các chỉ mục này, hãy xem xét các vấn đề bạn gặp phải.

Hãy xem xét truy vấn sau "select show_trgm ('Jaime Casanova');" Điều này cho chúng ta thấy bát quái của một chuỗi văn bản, trong trường hợp này là 15 bát quái. Vì vậy, không khó để tưởng tượng rằng loại chỉ số này phát triển rất nhiều, và các chuỗi văn bản càng lớn thì chỉ số này càng phát triển (vì sẽ có nhiều bát quái hơn). Một kết luận rõ ràng khác là việc duy trì loại chỉ mục này có thể tốn kém, trên thực tế, chúng có thể ảnh hưởng lớn đến hiệu suất của INSERT và UPDATE, đặc biệt nếu có một số chỉ mục này trên cùng một bảng, để giảm bớt vấn đề này một chút, một kỹ thuật gọi là fastupdate đã được phát minh bao gồm việc duy trì một danh sách chờ xử lý không có thứ tự. Vì vậy, INSERT và UPDATE thay vì chèn vào chỉ mục chính, chúng làm như vậy vào cấu trúc bổ sung này cho đến khi xảy ra VACUUM hoặc cho đến khi danh sách đang chờ xử lý trở nên lớn hơn work_mem. Các hạn chế là:1) đọc chỉ mục cũng phải đọc cấu trúc bổ sung này, có thể ảnh hưởng đến hiệu suất truy vấn; và 2) CHÈN hoặc CẬP NHẬT có thể khiến tồn đọng quá lớn và do đó sẽ bắt đầu xử lý tồn đọng, điều này sẽ ảnh hưởng đến CHÈN hoặc CẬP NHẬT đó và tất cả các hoạt động khác diễn ra đồng thời trên bảng đó.

Tóm lại là; chỉ mục GIN cùng với mô-đun pg_trgm có thể giúp ích rất nhiều cho hiệu suất của một số truy vấn, tuy nhiên, không nên lạm dụng chúng vì chúng có thể là con dao hai lưỡi.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL nơi tất cả trong mảng

  2. Rails Migrations:đã cố gắng thay đổi loại cột từ chuỗi thành số nguyên

  3. Cột thay đổi Rails Migration để sử dụng mảng Postgres

  4. Thay đổi mã hóa cơ sở dữ liệu PostgreSql

  5. Tương đương PostgreSQL cho ISNULL () là gì