大型数据库查询:优化

时间:2018-02-06 14:40:35

标签: 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秒钟。这会是由于许多数据库连接太低造成的吗?

我该如何解决这些问题?

2 个答案:

答案 0 :(得分:1)

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

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

示例索引:

{

 if (mAuth.getCurrentUser()!=null){

            final String user_id = mAuth.getCurrentUser().getUid();

        if (mAuth.getCurrentUser().getUid().equals(user_id)) {



            post_username2.setText(username);

        }
}

或:

CREATE INDEX ON product USING gin (description gin_trgm_ops);

您需要在GIN或GiST之间进行选择... GIN查询速度更快,但创建速度较慢,更新速度较慢,且通常大于GiST。

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

答案 1 :(得分:0)

我建议使用likeproduct_id创建包含reference的表product_references,而不是使用Link(此列可以编入索引)。一个产品可以有多个引用,因此它将具有多个product_references行。然后应该改变流程如下:

  • 创建产品时,解析该产品说明中的参考资料并在product_references表中搜索类似产品
  • 创建NumberDecimal("12.34")对象作为业务规则
  • 为新产品
  • 创建新的product_reference行

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