【问题标题】:performance: findAndUpdate VS direct save and remove duplicates性能:findAndUpdate VS 直接保存和删除重复项
【发布时间】:2013-11-23 17:48:24
【问题描述】:

我需要每分钟在 mongo 集合中插入 1000 个项目以防止重复。

使用 findAndUpdate/Upsert 会大大降低服务器性能。

保存项目而不检查重复服务器不会变慢,但我需要一个 cronjob 来删除所有重复的项目。

扩大规模的最佳方法是什么?

  • 一台具有高 RAM 的机器?多少钱?
  • 许多机器具有副本集和较低的 RAM?
  • 也许是分片?

【问题讨论】:

  • 如何检查它们是否重复? findAndUpdate 调用的代码是什么样的?
  • 什么是 findAndUpdate? mongodb 中没有这样的操作——那是你自己的代码吗?可能那里效率低下。
  • @AsyaKamsky - 我现在意识到他的意思可能是findAndModify

标签: node.js mongodb mongoose


【解决方案1】:

您可以通过创建unique index 自动清除重复项。

示例:如果您想在已经存在具有相同名字和姓氏组合的文档时拒绝文档,您将创建如下索引:

db.addresses.ensureIndex( { "first_name": 1, "last_name": 1 }, { unique: true } )

如果您的集合中已经有重复项,并且您希望在创建索引时将它们删除,您还需要设置 dropDups 选项:

db.addresses.ensureIndex( { "first_name": 1, "last_name": 1 }, { unique: true, dropDups:true } )

要在执行批量插入时进一步提高性能,您可以将 write-concern 设置为 w: 0。这将导致您的应用程序将文档发送到数据库而无需等待确认。

解决您的其他建议:副本集不会提高写入性能,因为只有主节点才能接受写入。但是您可以通过设置分片集群来提高写入性能,因为写入将根据 shard-key 分布在集群成员上。

【讨论】:

  • findAndUpdate相比,使用唯一索引的操作会更快吗?我从来没有比较过两者。我以为他们做了几乎相同的事情(假设存在一个涵盖 find 的索引。
  • 当您有适当的非唯一索引时,与 findAndUpdate 的差异可能很小。但是如果没有索引,findAndModify 将不得不扫描整个集合以查找重复项,这对于大型集合可能需要一段时间。
  • 惊人的解释,谢谢。我会找到更多关于写关注和分片的信息。谢谢!
  • 只是建议:对于我必须使用的字符串索引:db.users.ensureIndex({first_name:"text"},{unique:true,dropDups:true});
  • @Leabdalla 我假设您的收藏仍然是空的并且不包含任何重复项。我更新了答案。但我怀疑它与作为字符串的字段有什么关系。正常的 MongoDB 索引是无类型的,就像 MongoDB 中的所有内容一样(有两个特殊的索引类型的,地理索引和全文索引,但在这种情况下这些是无关紧要的)。
猜你喜欢
  • 1970-01-01
  • 2016-10-06
  • 1970-01-01
  • 2020-01-18
  • 1970-01-01
  • 2012-10-03
  • 1970-01-01
  • 1970-01-01
  • 2016-12-28
相关资源
最近更新 更多