【发布时间】:2021-12-05 20:44:47
【问题描述】:
我正在尝试优化这些慢查询(请原谅 SQL 与 Ruby on Rails 混合):
WHERE name ILIKE %<the user's search text>%WHERE lower(NAME) LIKE :search OR lower(BARCODE) LIKE :search OR lower(SKU) like :search, search: "%<the user's search text>%"
如您所见,这些都是以% 开头和结尾的通配符查询,这意味着正常的索引是无用的。该表由项目组成,当用户的项目不是很多时查询很好,但是当用户有很多项目(数万)时,这需要很长时间(如数十秒)。我怎样才能提高性能?搜索文本是条形码或产品名称的一部分,因此它与我只是尝试搜索文本不同(在这种情况下我会使用全文搜索,以便搜索“狗”会产生包含'dogs' 或 'doggy' 等)。在其中一个用例中,我也在同一张表的多个列中进行搜索。
我考虑过的一些初步方法,但不确定这些方法是否可行:
- 全文搜索(添加一列是要搜索的多个列中的
to_tsvector,然后为新列添加 gin 索引) - 三元索引(更合适?)
- 我没有想到的其他建议
我正在使用 PostgreSQL 13 和 Ruby on Rails。
【问题讨论】:
-
AFAIK 三元组索引是您想要的。一个快速的检查方法是获取你要使用的 SQL (
Model.where(...).to_sql),查看psql中的explain the_sql(你可能会看到表扫描),然后添加索引并查看再次在 EXPLAIN 输出(您应该会看到它正在查看新索引)。
标签: sql ruby-on-rails postgresql