长游标操作期间的写操作

时间:2014-03-05 21:39:50

标签: mongodb

我将MongoDB 2.4与单个数据库一起使用。

我找到了一个集合中的所有项目(50.000+),并且每个项目都将其插入到另一个项目中。

it = coll1.find()
while (it.hasNext()) {
  coll2.save(it.next())
}

当在同一个数据库上打开cusor时,进行密集写入会导致性能问题吗?

2 个答案:

答案 0 :(得分:0)

否则游标不是原子的。每次读取都是自己的原子事务。这意味着mongo不会遇到确保光标及时代表单个快照的问题。

答案 1 :(得分:0)

这基本上归结为一个关于并发性(http://docs.mongodb.org/manual/faq/concurrency/)能够在创建写密集负载时能够在单个数据库级别编写器贪婪锁上执行读取的问题。

MongoDB应该能够在这里很好地兼顾你的读锁定,交织操作并在它认为适合保持性能的某些条件下产生当前操作(参见上面提供的链接)。

当然,这与读取和写入操作被隔离的SQL形成对比,因此这意味着MongoDBs并发规则实际上打破了ACID中的I。当然,在SQL中,锁更精细,因此您可以正常获得相对性能。

如果你确实看到性能受到影响,主要是由于IO(读取需要IO也记得),那么你可能会发现将你的写入批量分成1000组是谨慎的,每次批处理后需要大约5秒的休息时间才能让IO平息。