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

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

作为示例应用程序,我今天写了一个相当简单的应用程序,它使用Twitterstream媒体APIsearch某些关键字,然后将结果存储在MongoDB中。 该应用程序是用Node.js写的。

我正在存储2个集合。 一个存储关键字和一个微博ID的数组,引用发现每一个提示该关键字的微博。 这些被添加到数据库使用.update()与{upsert:true},以便新的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个小时。 我存储了大量的数据,可能每分钟几百个文件。 目前Mongodb中的对象数量是120k +。

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

我正在阅读设置索引,但由于我添加文件,而不是对他们运行查询,我不知道索引是否会有所帮助。 我认为发生在我身上的是update()可能正在做一个查找,因为我使用$ push,并且索引可能有帮助。

我应该考虑如何让MongoDB不断消耗越来越多的CPU?

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

在MongoDB中很可能会遇到一个非常普通的问题。 由于您是通过添加string来非常频繁地更新文档,因此很有可能您的文档空间不足,并且迫使数据库通过在文档末尾重写该文档而不断移动到内存\磁盘中的不同空间的数据文件。

添加索引只会伤害写入性能,除非您阅读起来很重,否则无助于提高性能。

我会考虑改变你的应用程序逻辑来做到这一点:

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