Câu trả lời phụ thuộc vào nhiều yếu tố như phiên bản Postgres, mã hóa và ngôn ngữ - LC_COLLATE
nói riêng.
Biểu thức trống lower(description) LIKE '%abc%'
thường nhanh hơn một chút so với description ILIKE '%abc%'
và nhanh hơn một chút so với biểu thức chính quy tương đương:description ~* 'abc'
. Điều này quan trọng đối với các lần quét tuần tự trong đó biểu thức phải được đánh giá cho mọi hàng được kiểm tra.
Nhưng đối với các bảng lớn như bạn chứng minh trong câu trả lời của mình, người ta chắc chắn sẽ sử dụng một chỉ mục. Đối với các mẫu tùy ý (không chỉ được neo bên trái), tôi đề xuất chỉ mục bát quái bằng cách sử dụng mô-đun bổ sung pg_trgm
. Sau đó, chúng ta nói về mili giây thay vì giây và sự khác biệt giữa các biểu thức ở trên bị vô hiệu hóa.
Chỉ mục GIN và GiST (sử dụng gin_trgm_ops
hoặc gist_trgm_ops
các lớp toán tử) hỗ trợ LIKE
(~~
), ILIKE
(~~*
), ~
, ~*
(và một số biến thể khác) giống nhau. Với chỉ mục GIN hình tam giác trên description
(thường lớn hơn GiST, nhưng đọc nhanh hơn), truy vấn của bạn sẽ sử dụng description ILIKE 'case_insensitive_pattern'
.
Có liên quan:
- Các biến thể hiệu suất truy vấn LIKE của PostgreSQL
- Chuỗi UTF-8 tương tự cho trường tự động hoàn thành
Kiến thức cơ bản về đối sánh mẫu trong Postgres:
- Đối sánh mẫu với LIKE, SIMILAR TO hoặc biểu thức chính quy trong PostgreSQL
Khi làm việc với chỉ mục bát quái nói trên, nó thường là thực tế hơn để làm việc với:
description ILIKE '%abc%'
Hoặc với toán tử regexp không phân biệt chữ hoa chữ thường (không có %
ký tự đại diện):
description ~* 'abc'
Chỉ mục trên (description)
không hỗ trợ các truy vấn trên lower(description)
như:
lower(description) LIKE '%abc%'
Và ngược lại.
Với các vị từ trên lower(description)
độc quyền , chỉ mục biểu thức là tùy chọn tốt hơn một chút.
Trong tất cả các trường hợp khác, một chỉ mục trên (description)
thích hợp hơn vì nó hỗ trợ cả hai các vị từ phân biệt chữ hoa chữ thường và phân biệt chữ hoa chữ thường.