簡體   English   中英

大數據庫查詢:優化

[英]Large database query: optimisation

我有一個帶有description屬性的Product模型。 創建新產品時,我需要查找描述中具有相應引用的產品,並在它們之間創建一個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 大。

如果它解決了您的問題,請嘗試此操作。

我建議不要使用like ,而是創建包含 2 列的表 product_references : product_idreference (該列可以被索引)。 一個產品可以有多個引用,因此它將有多個 product_references 行。 然后流程應該改變如下:

  • 創建產品時,解析該產品描述中的引用並在 product_references 表中搜索類似產品
  • 創建Link對象作為您的業務規則
  • 為新產品創建新的 product_reference 行

解析、搜索、鏈接和創建新 product_reference 的步驟可以由后台作業處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM