我有一个 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/