我正在寻找有关如何在以下情况下提高数据库性能的提示。
作为一个示例应用程序,我今天编写了一个相当简单的应用程序,它使用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?
答案 0 :(得分:9)
很可能你在MongoDB中遇到了一个非常普遍的瓶颈。由于您通过添加字符串非常频繁地更新文档,因此很可能您的文档空间不足并迫使数据库通过在尾端重写它来不断地将该文档移动到内存\磁盘中的不同空间数据文件。
添加索引只会损害写入性能,因此除非您阅读量很大,否则无法提高性能。
我会考虑更改您的应用程序逻辑来执行此操作:
ids
属性。然后在插入之后立即删除该数组中的所有id。这将导致mongodb为整个文档分配额外的空间,这样当你开始向id字段添加id时,它将有足够的空间来增长。ids
字段答案 1 :(得分:6)
你走在正确的道路上。更新的查询部分需要索引,否则它正在运行表扫描。关键字的缩进索引,您会看到更新性能显着提高。
答案 2 :(得分:0)
https://docs.mongodb.com/manual/reference/operator/update/positional/#up.S
希望能帮助您!
位置$运算符可标识要更新的数组元素,而无需显式指定该元素在数组中的位置。 https://getvideo.pro/watch/mongodb-querying-sub-documents-and-using-the-positional-operator-in-projection-vid-fEvYkBDW0Iw或:https://getvideo.pro/watch/mongodb-a-to-z-video-18-updating-multiple-documents-with-positional-operator-vid-Z2dTXbktLEQ