更新大量数据的最快方法

时间:2011-08-27 07:50:25

标签: mongodb

我在mongo集合中有数百万行,需要更新所有行。 我写了一个像这样的mongo shell(JS)脚本:

db.Test.find().forEach(function(row) {
    // change data and db.Test.save()
});

(我猜)应该更快,例如由于Web服务器和mongo服务器本身之间可能存在延迟而导致通过任何语言驱动程序进行更新,并且因为事实上,该驱动程序是“顶部的某些内容”并且mongo是“地下室中的某些东西< / EM>”。

即使它可以在具有4GB RAM的四核2.27GHz处理器上大致更新 2 100 rec./sec

据我所知 mongoimport 可以处理 40k rec./sec (在同一台机器上),我不认为提到的速度是“快”。< / p>

有更快的方法吗?

1 个答案:

答案 0 :(得分:3)

这里有两个可能的限制因素:

  1. 单写锁: MongoDB只有一个写锁,这可能是决定因素。
  2. 磁盘访问:如果要更新的数据不在内存中,则需要从磁盘加载,这将导致速度变慢。
  3.   

    有没有更快的方法?

    这里的答案取决于瓶颈。尝试运行iostatmongostat以查看瓶颈在哪里。如果iostat显示高磁盘IO,那么您将被磁盘阻止。如果mongostat显示高“锁定%”,那么您最大限度地访问全局写锁定。

    如果你已经超出了IO,那么没有简单的代码修复。如果你已经超出写锁定,则没有简单的代码修复。如果这些都不是问题,那么可能值得尝试另一个驱动程序。

      

    据我所知,mongoimport可以处理大约40k rec./sec(在同一台机器上)

    这可能不是一个公平的比较,很多人在新数据库上运行mongoimport,数据通常只是加载到RAM中。

    首先检查iostat / mongostat