sql - 大型数据库查询 : optimisation

标签 sql ruby-on-rails database postgresql activerecord

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

例子:

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);

或:

CREATE INDEX ON product USING gist (description gist_trgm_ops);

您需要在 GIN 或 GiST 之间做出选择...GIN 查询速度更快,但创建速度更慢,更新速度更慢,并且通常比 GiST 更大。

如果它能解决您的问题,请试试这个。

关于sql - 大型数据库查询 : optimisation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48645563/

相关文章:

ruby-on-rails - 没有路由匹配 { :controller= >"stocks", :action= >"create"} RSpec Rails 3

database - 有没有办法自动删除文本字段中的所有前导和尾随空格

c# - 如何使用 c# sql server 向现有表添加新行

mysql - StaticPages 中的 NoMethodError#home

MongoDB:设计统计仪表板模式

SQL根据专业获取平均诊断数

mysql - 如何在使用select查询时将mysql中的数字转换为字符

c# - 如何在 Jquery 中正确调用 C# 变量。 'variable name'当前上下文中不存在

mysql - MySql Workbench 中的 Sql Server Management Studio USE 语句等效项

ruby-on-rails - 设计迁移不起作用