如何提高MongoDB中update()和save()的性能?

时间:2011-06-21 10:43:16

标签: performance mongodb node.js

我正在寻找有关如何在以下情况下提高数据库性能的提示。

作为一个示例应用程序,我今天编写了一个相当简单的应用程序,它使用Twitter流API搜索某些关键字,然后我将结果存储在MongoDB中。该应用程序使用Node.js编写。

我正在存储2个收藏。一个存储关键字和一个推特ID的数组,它们引用了每个提到该关键字的推文。使用带有{upsert:true}的.update()将这些内容添加到数据库中,以便将新ID附加到'ids'数组。

此集合中的示例文档如下所示:

{     “_id”:ObjectId(“4e00645ef58a7ad3fc9fd9f9”),     “ids”:[“id1”,“id2”,“id3”],     “keyword”:“#chocolate” }

更新代码:

 keywords.update({keyword: key_word},{$push:{ids: id}},{upsert:true}, function(err){})

第二个集合看起来像这样,只需使用.save()

即可添加
 {
     "twt_id": "id1",
     "tweet": { //big chunk of json that doesn't need to be shown }
 }

我现在已经在我的Macbook上运行它已经持续了大约2个小时。我正在存储 lot 数据,可能每分钟有几百个文档。现在,Mongodb中的对象数量是120k +。

我注意到的是,自从我开始最新的测试运行以来,数据库进程的CPU使用率高达84%并且一直在逐渐上升。

我正在阅读设置索引,但由于我正在添加文档而不是针对它们运行查询,我不确定索引是否会有所帮助。我想到的一个方面是update()可能正在进行查找,因为我正在使用$ push而索引可能对此有所帮助。

我应该怎样看待MongoDB不要吃掉越来越多的CPU?

3 个答案:

答案 0 :(得分:9)

很可能你在MongoDB中遇到了一个非常普遍的瓶颈。由于您通过添加字符串非常频繁地更新文档,因此很可能您的文档空间不足并迫使数据库通过在尾端重写它来不断地将该文档移动到内存\磁盘中的不同空间数据文件。

添加索引只会损害写入性能,因此除非您阅读量很大,否则无法提高性能。

我会考虑更改您的应用程序逻辑来执行此操作:

  1. 关键字字段的索引
  2. 每次检测到推文时,在向数据库插入任何内容之前,请查询包含该关键字的文档。如果它不存在,则插入一个新文档,但通过在数组中添加一大堆伪字符串来填充ids属性。然后在插入之后立即删除该数组中的所有id。这将导致mongodb为整个文档分配额外的空间,这样当你开始向id字段添加id时,它将有足够的空间来增长。
  3. 将推文的ID插入ids字段

答案 1 :(得分:6)

你走在正确的道路上。更新的查询部分需要索引,否则它正在运行表扫描。关键字的缩进索引,您会看到更新性能显着提高。

答案 2 :(得分:0)