【问题标题】:MongoDB select's/find seems to have the same performance for a larger amount of dataMongoDB select's/find 似乎对于大量数据具有相同的性能
【发布时间】:2015-03-06 14:35:31
【问题描述】:

我正在使用其原生驱动程序测量 MongoDB 的性能。 对于插入操作,我插入的次数越多,花费的时间就越多。但是,通过选择,我有 500.000 个文档(在 1 个集合中),每个文档中都有 4 个其他嵌入的小文档。

我还对 1 个子文档使用条件操作执行了选择查询。选择 100 个文档(总共 1000 个)的性能为 0,007 ms,而选择 50000 个文档(总共 500000 个)的性能为 0,008 ms。

我不太明白这怎么可能。真的那么快吗?我正在使用 JMH 测量性能。

【问题讨论】:

  • 一个疯狂的猜测是您执行的查询没有任何索引,因此数据库无论如何都需要扫描整个集合。但要确保请使用.explain() 执行查询,以获取有关查询索引使用情况的更多信息,并将查询和解释输出添加到您的问题中。
  • 另一种猜测是您只测量打开游标的时间,而不是实际从游标中检索数据的时间。请发布您的代码,否则您的问题无法得到解答。
  • 感谢朋友的评论。我更新了我的问题。我现在试试 .explain()。

标签: java mongodb mongodb-java mongo-java database


【解决方案1】:

您的测试设置仅测量打开游标所需的时间,而不是实际从游标读取任何数据的时间。

当您执行contactCollection.find(bs); 时,数据库返回一个游标对象,但实际上还没有做任何事情。在您从游标检索数据之前,不会发生实际查询。将行更改为contactCollection.find(bs).toArray() 应该会强制数据库返回所有结果,从而允许您测量查询时间、通过网络传递结果以及Java 驱动程序解析结果所需的时间。

或者,您可以使用contactCollection.find(bs).explain() 来衡量操作仅在数据库级别上花费的时间,并从数据库本身获取具有一些有用性能指标的 DBObject。

【讨论】:

  • 谢谢你,伙计。我一直认为 find 足以衡量,但没有意识到除了返回光标对象之外它没有做任何事情。现在大约是 5000 毫秒,这似乎更准确。然而,在这个操作中,toArray() 方法是公平的吗?
  • 感谢您更新您的答案!真的很清楚!我将使用解释方法! :)
  • 它获取结果的速度如此之快真是令人惊讶(使用 explain() 大约需要 1000 毫秒)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多