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

Geu*_*uis 8 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){})
Run Code Online (Sandbox Code Playgroud)

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

 {
     "twt_id": "id1",
     "tweet": { //big chunk of json that doesn't need to be shown }
 }
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Bry*_*isi 9

你很有可能在MongoDB中遇到一个非常普遍的瓶颈.既然你是通过添加字符串更新文件很频繁,还有就是你正在运行的该文档的空间,并迫使该数据库不断地通过在尾部将其重写该文件移动到内存\硬盘不同空间的好机会数据文件.

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

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

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

  • 我会遵循关于关键字字段的建议,并注意文档重定位的警告。在现代版本中,您可以在集合中指定填充因子,以自动为每个条目腾出更多空间。 (2认同)

Bre*_*ams 7

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