【问题标题】:Spring + MongoDB custom queries running slowSpring + MongoDB 自定义查询运行缓慢
【发布时间】:2021-08-16 17:12:05
【问题描述】:

我有一个约 7000 个文档的 MongoDB 集合(称为“产品”),托管在 Mongo Atlas 共享集群上,看起来有点像这样:

{
   identifier: 123,
   archived: true,

   /* Some other properties.. */
}

尝试以如下方式对上述集合运行简单查询:

mongoTemplate.find(
      new Query().addCriteria(Criteria.where("archived").is(false)), 
      Product.class, 
      "Products");

导致执行时间非常长,本地实例和部署的 (Heroku) 版本都需要 8~9 秒。但是,当直接从 MongoRepository<> 运行相同的查询时,例如 repository.findByArchived(false),查询几乎立即运行(就像在 mongo CLI 中一样)。

我是否遗漏了一些额外的配置,这些配置会阻止 mongoTemplate 以更流畅的方式运行查询,例如预配置的 MongoRepository(例如一些 bson/POJO 编码)?对此的任何帮助将不胜感激!

【问题讨论】:

  • 您能否确认在您的应用程序中没有额外的 mongo 相关过滤器/配置?或者换句话说,您可以使用最小代码在单独的应用程序中重现它。
  • 尝试使用现有索引或添加索引:new Query().addCriteria(Criteria.where("archived").is(false)).withHint("your_index")
  • 每个查询可以运行 3-4 次吗?好像您第一次使用.addCriteria 运行,然后当您运行findByArchived 时,MongoDB 使用缓存并快速返回。同时为这两个查询提供.explain

标签: java mongodb spring-boot spring-data spring-data-mongodb


【解决方案1】:

在 MongoTemplate 中使用条件查询

我可能完全误解了您的问题领域,但我希望 我并没有完全迷失。 在我看来,您似乎想要一个系列中 archived 属性为 false 的项目列表?

不确定其他一些属性是什么意思,但有了这些数据:

    {
       identifier: 123,
       archived: true,
    
       /* Some other properties.. */
    }

在我看来,您可以通过使用获得更好的性能、可读性和结果 ProjectionMongoTemplate 一起仅包含您真正想要的属性并排除其余属性。

所以不要写:


mongoTemplate.find(
      new Query().addCriteria(Criteria.where("archived").is(false)), 
      Product.class, 
      "Products");

你可能会更好地做这样的事情


public List findActive() {
    Query query = new Query();
    // Here you exclude those unrelated 'other properties'
    query.fields().exclude("prop1").exclude("prop2");
    query.addCriteria(Criteria.where("archived").is(false));
        
    return mongoTemplate.find(query, Product.class);
}

无论如何,正如我所说,如果我误解了这个问题,请告诉我。 如果是这样,我会更正错误。

【讨论】:

    【解决方案2】:

    虽然无法准确回答您需要更改的内容,但如果连接正常,则可能您的代码未优化,我建议您检查对代码所做的最新更改(如果数据库有 ~ 7000 份文件,我假设它直到最近才正常工作)。

    另外,可能会发生这样的事情:Why is processing a sorted array faster than processing an unsorted array?

    【讨论】:

      【解决方案3】:

      很难说出导致自定义查询缓慢的确切原因,但 atlas 提供了多种工具来帮助分析在集群上执行的缓慢查询。

      Performance Advisor 监控 MongoDB 认为速度较慢的查询,并建议新的索引以提高查询性能。 一定要读一读—— Performance Advisor

      【讨论】:

      • 当相关数据几乎不包含任何需要为此查询编制索引的内容时,我怀疑是否存在索引问题。
      猜你喜欢
      • 2017-11-06
      • 2019-07-07
      • 2018-07-19
      • 1970-01-01
      • 2019-07-28
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多