性能MongoDB java驱动

Posted

技术标签:

【中文标题】性能MongoDB java驱动【英文标题】:Performance Mongodb java driver 【发布时间】:2015-11-26 14:39:35 【问题描述】:

我在我的项目中使用 mongodb java 驱动程序对大型集合(500 万个文档)执行查询(查找、聚合、mapreduce 等)

驱动版本为:

<!-- MongoDB driver-->
<dependency>
  <groupId>org.mongodb</groupId>
  <artifactId>mongo-java-driver</artifactId>
  <version>3.0.3</version>
</dependency>

我的问题是当我使用 api find 和一些来自 java 的过滤器时,操作需要 15 秒。

....
Iterable<Document> messageList = collection.find().filter(... some filters).sort(... fields);

// Find documents
for (Document message : messageList) 
....
// some code
....

我检查了 mongo 服务器日志文件,发现跟踪是 COMMAND 而不是 QUERY

2015-09-01T12:11:47.496+0200 I COMMAND [conn503] command b.$cmd command: count count: "logs", query: timestamp: $gte: new Date(1433109600000) ,应用程序:“APP1”,事件:“事件1”计划摘要:IXSCAN 时间戳:1,应用程序:1 keyUpdates:0 writeConflicts:0 numYields:19089 reslen:44锁:全局:acquireCount:r:19090 , MMAPV1Journal: acquireCount: r: 19090 , Database: acquireCount: r: 19090 , Collection: acquireCount: R: 19090 14297ms

如果我从 mongodb 客户端 (Robomongo) 运行相同的查询,则需要 0.05 毫秒。

db.getCollection('logs').find( timestamp:  $gte: new Date(1427839200000) , aplicacion: "APP1", event: "Event1" )

并且在服务器日志中是 QUERY

所有使用驱动java命令进行的查询(find、aggregate、...)都会被转换?性能比mongo shell差很多。

【问题讨论】:

您尝试过collection.find(... some filters...).sort(... fields); 吗?这不使用MongoCursor.filter 方法,而是在打开游标时提供过滤条件。这将更接近您的 shell 查询。 是的,我尝试但结果相同。 我刚刚注意到您的 shell 查询没有sort。也许这就是罪魁祸首? 没有。它有排序子句。为了更清楚,我没有在评论中设置它 【参考方案1】:

我认为问题是当您在 mongo shell 中运行查询时,它一次只会返回前 20 个结果,在这里您尝试读取所有文档并将其放入数组中

试试这个查询看看

List messageList = collection.find(filter).sort(...field).limit(20).into(new ArrayList());

强烈建议在查询字段上创建索引。

【讨论】:

我不这么认为。我使用限制子句查询具有相同结果的分页。我知道建议创建索引。 限制结果后你是否面临同样的问题? 我刚刚看到,问题性能不是查找查询。它需要与 robomongo 客户端相同的时间。 (15 毫秒)在此发现上瘾,我执行 count() 查询以获取文档总数(用于进行分页)。此查询耗时超过一分钟,有 250 万份文档。

以上是关于性能MongoDB java驱动的主要内容,如果未能解决你的问题,请参考以下文章

从 MongoDB Java Rx 驱动程序迁移到反应式流驱动程序的性能下降

如何通过java驱动程序在mongodb中存储38位整数

Reactive-MongoDB 异步 Java Driver 解读

Java版本,Java版本MongoDB驱动,驱动与MongoDB数据库,Spring之间的兼容性

Java版本,Java版本MongoDB驱动,驱动与MongoDB数据库,Spring之间的兼容性

MongoDB快速入门学习笔记8 MongoDB的java驱动操作