首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大型数据库查询:优化

大型数据库查询:优化
EN

Stack Overflow用户
提问于 2018-02-06 14:40:35
回答 2查看 62关注 0票数 1

我有一个带有Product属性的description模型。在创建新产品时,我需要寻找在描述中具有相应引用的产品,并在它们之间创建一个Link对象。

示例:

代码语言:javascript
复制
Product 1
Description: ".... 58274072 ... "

我需要查找描述中包含58274072的所有产品:

代码语言:javascript
复制
similar_products = Product.where("description like ?", "%58274072%")

我有两个问题:

  • 考虑到我们拥有大量的产品记录,这个查询可能需要几秒钟才能运行。有更快的方法来进行查询吗?
  • 我是在批处理作业中运行这个查询的,因此可能会有10个作业同时运行,并试图执行此查询。当仅对一个查询进行基准测试时,假设运行时间为2秒。当在一个批处理中运行它时,它最多需要6秒。这是否是由于大量的数据库连接过低造成的?

我怎样才能解决这些问题?

EN

回答 2

Stack Overflow用户

发布于 2018-02-06 14:59:20

要优化索引,您应该使用trigam扩展。

为此,您需要安装模块pg_trgm,它为GIN和GiST trigram索引提供操作符类,以支持所有类似和ILIKE模式:

示例索引:

代码语言:javascript
复制
CREATE INDEX ON product USING gin (description gin_trgm_ops);

或者:

代码语言:javascript
复制
CREATE INDEX ON product USING gist (description gist_trgm_ops);

你需要在杜松子酒和GiST之间做出选择.GIN查询速度更快,但创建速度更慢,更新速度更慢,而且通常比GiST更大。

如果它能解决你的问题,就试试这个吧。

票数 1
EN

Stack Overflow用户

发布于 2018-02-06 15:13:20

与使用like不同,我建议创建带有2列的表product_references:product_idreference (可以对该列进行索引)。一个产品可以有多个引用,这样它就会有多个product_references行。然后,应将流更改如下:

  • 创建产品时,解析该产品描述中的引用,并在product_references表中搜索类似的产品。
  • 创建Link对象作为业务规则
  • 为新产品创建新的product_reference行

解析、搜索、链接和创建新product_reference的步骤可以由后台作业处理。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48645563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档