Windows MongoDB vs CouchDB(速度优化)
我做了一些速度测试来比较MongoDB和CouchDB。在测试时,仅使用插入件。我的MongoDB比CouchDB快15倍。我知道这是因为套接字和http。但是,对我来说非常有趣的是,如何在CouchDB中优化插入 测试平台:Windows XP SP3 32位。 我使用了最新版本的MongoDB、MongoDB C#Driver和最新版本的CouchDB for WindowsWindows 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
谢谢 我不认为套接字和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);
}
}
}