Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 大型数据库查询:优化_Sql_Ruby On Rails_Database_Postgresql_Activerecord - Fatal编程技术网

Sql 大型数据库查询:优化

Sql 大型数据库查询:优化,sql,ruby-on-rails,database,postgresql,activerecord,Sql,Ruby On Rails,Database,Postgresql,Activerecord,我有一个产品模型,带有描述属性。 创建新产品时,我需要查找在其描述中具有相应引用的产品,并在它们之间创建一个链接对象 例如: Product 1 Description: ".... 58274072 ... " 我需要查找描述中包含58274072的所有产品: similar_products = Product.where("description like ?", "%58274072%") 我有两个问题: 鉴于我们拥有大量的产品记录,此查询可能需要几秒钟的时间才能运行。有没有更快的

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

例如:

Product 1
Description: ".... 58274072 ... "
我需要查找描述中包含
58274072
的所有产品:

similar_products = Product.where("description like ?", "%58274072%")
我有两个问题:

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

如何解决这些问题

要优化LIKE上的索引,您应该使用trigam扩展

为此,您需要安装模块pg_trgm,该模块为GIN和GiST三元索引提供运算符类,以支持所有LIKE和ILIKE模式:

示例索引:

CREATE INDEX ON product USING gin (description gin_trgm_ops);
或:

你需要在杜松子酒和吉斯特酒之间选择。。。GIN查询速度更快,但创建速度较慢,更新速度较慢,通常比GiST大


如果可以解决您的问题,请尝试此操作。

我建议创建包含两列的表product\u引用,它们是:
product\u id
reference
(此列可以索引)。一个产品可以有多个引用,这样它将有多个产品引用行。然后,应按照以下方式更改流量:

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

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

在我看来,这更像是一个数据库问题,而不是前端问题。如果我经常执行这样的查询,我会考虑在后端支持,例如使用全文索引、tsvector、引用关键字作为数组索引等,这取决于您使用的数据库。@CetinBasoz我没有将其标记为frontend@GrahamSlick你标记了ruby on rails,但是没有标记SQL平台不要在
模式中使用通配符。不管表上有什么索引或分区,它们都会强制进行完整的表扫描。啊,现在标记为postgresql。我会研究tsvector,然后tsquery(可以被索引)。或者为可以索引的“搜索关键字”数组设置另一个字段。
CREATE INDEX ON product USING gist (description gist_trgm_ops);