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?
你很有可能在MongoDB中遇到一个非常普遍的瓶颈.既然你是通过添加字符串更新文件很频繁,还有就是你正在运行的该文档的空间,并迫使该数据库不断地通过在尾部将其重写该文件移动到内存\硬盘不同空间的好机会数据文件.
添加索引只会损害写入性能,因此除非您阅读量很大,否则无法提高性能.
我会考虑更改您的应用程序逻辑来执行此操作:
ids通过在数组中添加一大堆伪字符串来填充属性.然后在插入之后立即删除该数组中的所有id.这将导致mongodb为整个文档分配额外的空间,这样当你开始将id添加到ids字段时,它将有足够的空间来增长.ids字段