通过并行查询并使用线程池来加速 mongo 查询?

Speed up mongo queries by parallel them and use a ThreadPool?

我们的 mongodb 架构每周存储数据。每周都有自己的数据库,其中包含相同的集合集。有时我必须检查超过 12 周的数据,这意味着我 运行 在 12 个不同的数据库上进行相同的查询(全部在一个 mongo 服务器上):

...
for (MongoOperationDto week : allWeeks) {
  results.addAll(repo.find(gid, week.db(), week.collection());
}
...

在这种情况下,我运行顺序地进行了12次find()。我猜是内部连接池处理它们还是?如果不是,如果我创建 12 个 Java 线程并且每个线程都会 运行 找到一个,那会有好处吗?也许喜欢:

public class FindTask {

    @Autowired
    MyMongoRepo repo;

    @Async
    public List<Result> doFindTask(long gid, MongoOperationDto week) {
         return repo.find(gid, week.db(), week.connection());
    }
}

哪种方法实际上更快,或者在检索数据时没有速度差异?

connection pool 处理连接,仅此而已:

In software engineering, a connection pool is a cache of database connections maintained so that the connections can be reused when future requests to the database are required

对于您的第一个代码,这意味着在第一个查找完成后而不是建立到 MongoDB 的新连接,它可以重用池中现有的已经打开但未使用的连接。

所以在第一种情况下,您将有 12 个串行查询和一个用于每个查询的连接。

在第二种情况下,您有 12 个并行查询同时使用 12 个不同的连接。

就性能而言,如果查询需要很长时间,第二种解决方案应该更快(完成时间),但它使用更多资源(ram,cpu 时间)。请注意,时间也受您的 MongoDB 架构影响。如果您的查询在同一个磁盘上进行长磁盘操作,可能将它们并行化不会减少太多总时间。