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

Posted

技术标签:

【中文标题】如何提高 MongoDB 中 update() 和 save() 的性能?【英文标题】:How to improve performance of update() and save() in MongoDB? 【发布时间】:2011-09-19 10:05:47 【问题描述】:

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

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

我正在存储 2 个集合。一个存储关键字和一组推文 ID,这些 ID 引用每条发现提及该关键字的推文。这些正在使用带有 upsert:true 的 .update() 添加到数据库中,以便将新 id 附加到“ids”数组中。

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

"_id": ObjectId("4e00645ef58a7ad3fc9fd9f9"), "ids": ["id1","id2","id3"], “关键字”:“#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%,并且自从我开始最新的测试运行以来一直在逐渐上升。

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

我应该注意什么来防止 MongoDB 占用越来越多的 CPU?

【问题讨论】:

具有慢速磁盘的 MacBook 不太可能是执行基准测试和谈论性能问题的正确选择..即使使用最新的 MacBook 硬件 @Blackmoon 接受的答案表明并非如此。 【参考方案1】:

您很可能遇到了 MongoDB 中非常常见的瓶颈。由于您通过添加字符串非常频繁地更新文档,因此您很有可能会用完该文档的空间并通过在尾部重写它来强制数据库不断将该文档移动到内存\磁盘中的不同空间数据文件。

添加索引只会损害写入性能,因此除非您阅读繁重,否则无助于提高性能。

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

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

【讨论】:

我会遵循关键字字段的建议,并注意文档重定位的警告。在现代版本中,您可以在集合中指定填充因子,以自动为每个条目腾出更多空间。 @pestilence669 我认为填充因子是动态计算的——你不能设置它。你知道方法吗? @spektom 对,我建议用空格或一些此类垃圾数据模拟自定义填充因子【参考方案2】:

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

【讨论】:

如果您不仅计划离线全表扫描处理,您现在应该添加所有搜索索引,以便衡量插入的实际性能。 谢谢布伦丹。我花了几天时间才回到这个问题上。我运行了一个小时的应用程序来恢复 CPU 的使用。我停止了应用程序,添加了索引,然后重新启动。现在 mongo 使用 1.0-1.4% cpu。我必须让它运行一段时间才能看到长期性能如何,但这是一个巨大的好处。谢谢。【参考方案3】:

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

【讨论】:

以上是关于如何提高 MongoDB 中 update() 和 save() 的性能?的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB update Array elements

MongoDB---如何避免插入重复数据(pymongo)

Mongodb 关于update和findAndModify

MongoDB 更新文档

tidb如何批量提高update执行效率

mongoDB 学习七