Windows MongoDB vs CouchDB(速度优化)

Windows MongoDB vs CouchDB(速度优化),windows,performance,testing,mongodb,couchdb,Windows,Performance,Testing,Mongodb,Couchdb,我做了一些速度测试来比较MongoDB和CouchDB。在测试时,仅使用插入件。我的MongoDB比CouchDB快15倍。我知道这是因为套接字和http。但是,对我来说非常有趣的是,如何在CouchDB中优化插入 测试平台:Windows XP SP3 32位。 我使用了最新版本的MongoDB、MongoDB C#Driver和最新版本的CouchDB for Windows 谢谢 我不认为套接字和http之间的区别是唯一的区别。差异还与磁盘同步(fsync)有关。这会影响耐久性。Mongo

我做了一些速度测试来比较MongoDB和CouchDB。在测试时,仅使用插入件。我的MongoDB比CouchDB快15倍。我知道这是因为套接字和http。但是,对我来说非常有趣的是,如何在CouchDB中优化插入

测试平台:Windows XP SP3 32位。 我使用了最新版本的MongoDB、MongoDB C#Driver和最新版本的CouchDB for Windows


谢谢

我不认为套接字和http之间的区别是唯一的区别。差异还与磁盘同步(fsync)有关。这会影响耐久性。MongoDB首先将所有内容存储在RAM中,并且它只在特定的时间间隔同步到磁盘,除非您明确告诉MongoDB进行fsync


阅读关于耐久性和MongoDB:和fsync:

要以批量方式将大量数据插入数据库,CouchDB支持批量插入,这在下面的wiki中进行了描述


此外,请查看上面链接中描述的
delayed_提交
configuration选项和
batch=ok
选项。这些选项可以实现类似的内存缓存行为,并定期对磁盘进行同步。

我一直在思考一个想法,但尚未进行基准测试。我希望在某些情况下它会很棒:

  • 插入吞吐量必须很高
  • 不需要按键获取单个文档
  • 所有数据都是通过视图获取的(可能与接收插入的机器不同)
计划 插入一批批的文档,并使用视图将它们序列化并返回

例子 考虑一个带有简单时间戳和消息字符串的日志文件

0.001 Start
0.123 This could be any message
0.500 Half a second later!
1.000 One second has gone by
2.000 Two seconds has gone by
[...]
1000.000 One thousand seconds has gone by
您可以为每个文档插入一条消息,例如:

{ "_id": "f30d09ef6a9e405994f13a38a44ee4a1",
  "_rev": "1-764efa883dda1e11db47671c4a3bbd9e",
  "timestamp": 0.123,
  "message": "This could be any message"
}
标准批量文档优化 第一个优化是使用
\u bulk\u docs
插入,如中所示

二次批量插入优化 但是,第二个优化是将日志预批处理到一个更大的coach文档中。例如,在4个批次中(在现实世界中,这将高得多):

当然,您也可以通过
\u bulk\u docs
插入这些文件,从而有效地插入批量数据

看风景还是很容易的 将日志序列化回视图中仍然非常容易:

// map
function(doc) {
  if(doc.logs) {
    // Just unroll the log batches!
    for (var i in doc.logs) {
      var log = doc.logs[i];
      emit(log.timestamp, log.message);
    }
  }
}
然后,获取时间戳介于
startkey
endkey
,或任何其他需要之间的日志将非常容易

结论
这仍然没有进行基准测试,但我希望,对于某些类型的数据,批处理成块将减少内部B树写入。结合
\u bulk\u docs
,我希望插入吞吐量能够达到磁盘的硬件速度。

只是在套接字与HTTP、fsync与内存对话之间进行迭代

默认情况下,MongoDB不会在写调用时返回响应。您只需将数据写入套接字,并假设它位于数据库中且可用。在并发加载下,这可能会被备份,并且没有一个好的方法来了解Mongo的实际速度,除非您使用一个可选调用,该调用将在数据可用时返回写入响应

我并不是说Mongo insert的性能不比Coach快,插入内存比同步到光盘快得多,这里更大的区别在于MongoDB和CouchDB在一致性和耐久性方面的目标不同。但是我看到的所有用于测试Mongo的“性能”工具都使用默认的写API,因此您不是在真正测试插入性能,而是在测试刷新到套接字的速度


我见过很多基准测试显示Mongo比Redis和memcached快,因为他们没有意识到当数据在内存中而Mongo没有时,Redis和memcached会返回响应。Mongo肯定不比Redis快(

我忘了数据刷新;)非常感谢。你说得对!这很有帮助;)我试图在1000×1000个数据块内存储1M个数据结构。速度非常快!谢谢你们。现在我有了解决方案;)不客气!接下来我将添加另一个更有争议的答案。当然,MongoDB也支持批量插入。。。这又使它比沙发快了15倍。有趣的是,我想知道你能用Erlang编写视图定义吗?我读到Erlang速度更快。实际上,大约一年前我在Mozilla做了类似的测试。您肯定是视图生成的瓶颈。当时,旧的spidermonkey是大型文档的一个巨大瓶颈,因此我编写了一个新的Python视图服务器。我敢打赌,使用一个新的spidermonkey,JSON序列化问题就会消失,这将值得再次进行基准测试。但是请记住,视图结果仍然是一个磁盘上的btree,并且在fsync完成之前视图不可用,因此它无法与Redis或MongoDB进行比较。Mikeal,是的,我认为它只在非常特殊的情况下才会发光。例如,日志被转储到一个数据库中,这个数据库复制到,我不知道,可能是一个休息室,它可以浏览您需要的所有视图行。一方面,以磁盘速度插入会很酷;但这将是最终的“基准”(贬义地使用)CouchDB不是最适合日志记录的DB。高可靠性、快速(ish)读取、预煮查询和慢速写入;它基本上与一个好的日志数据库相反(可靠性不重要,读取不重要,临时查询和快速写入-可能是Cassandra?)。
// map
function(doc) {
  if(doc.logs) {
    // Just unroll the log batches!
    for (var i in doc.logs) {
      var log = doc.logs[i];
      emit(log.timestamp, log.message);
    }
  }
}