【发布时间】:2018-02-06 14:40:35
【问题描述】:
我有一个Product 模型,具有description 属性。
创建新产品时,我需要在描述中查找具有相应引用的产品,并在它们之间创建一个Link 对象。
例子:
Product 1
Description: ".... 58274072 ... "
我需要查找描述中包含58274072 的所有产品:
similar_products = Product.where("description like ?", "%58274072%")
我有两个问题:
- 鉴于我们拥有大量产品记录,此查询可能需要几秒钟才能运行。有没有更快的查询方法?
- 我在批处理作业中运行此查询,因此可能有 10 多个作业同时运行并尝试执行此查询。单独对一个查询进行基准测试时,假设运行需要 2 秒。批量运行时,最多需要 6 秒。这会是由于数据库连接数太低造成的吗?
我该如何解决这些问题?
【问题讨论】:
-
在我看来,这更像是一个数据库问题,而不是前端问题。如果我经常执行这样的查询,我会考虑在后端支持,例如使用全文索引、tsvector、引用关键字作为数组索引等,具体取决于您使用的数据库。
-
@CetinBasoz 我没有把它标记为前端
-
@GrahamSlick 您标记了 ruby-on-rails,但没有标记您的 SQL 平台
-
不要在
like模式中使用通配符。无论您在表上拥有任何索引或分区,这些都会强制进行全表扫描。 -
啊,现在标记为 postgresql。然后我会研究 tsvector,tsquery(可以被索引)。或者有另一个可以被索引的“搜索关键字”数组字段。
标签: sql ruby-on-rails database postgresql activerecord