MongoDB:更新/升级与插入
最近,我注意到执行多个上传(via)和插入(多个文档)之间存在巨大的性能差异。我想知道我在这方面是否正确:MongoDB:更新/升级与插入,mongodb,mongodb-query,upsert,Mongodb,Mongodb Query,Upsert,最近,我注意到执行多个上传(via)和插入(多个文档)之间存在巨大的性能差异。我想知道我在这方面是否正确: Upsert/Updates类似于find()和update(),因此它执行两项读写操作 Insert将只进行写入,因此速度要快得多 那么性能的差异呢 如果是这种情况,我想知道我是否需要定期进行大量写入,而不是更新文档,而是使用createdOn字段编写新文档。然后要查询,我将只查询文档,按createdondesc排序。我想知道这是不是一个好方法?还是有更好的办法 我想知道我是否有
- Upsert/Updates类似于
和find()
,因此它执行两项读写操作update()
- Insert将只进行写入,因此速度要快得多
createdOn
字段编写新文档。然后要查询,我将只查询文档,按createdondesc
排序。我想知道这是不是一个好方法?还是有更好的办法
- 我想知道我是否有收藏索引,它会加速更新吗?但是这个索引会不会减慢写入部分的速度呢李>
- 第二种方式,我只做插入,如果我有太多的文档,它会变慢吗?(加快书写速度)实用吗李>
- 我还尝试增加连接池的大小。不确定什么是最佳的,但我尝试了20次,我发现我可以通过mongostat每秒处理abt 20个查询。我以为会高很多李>
upsert
如何在MongoDB中工作的“官方”解释,但可以肯定的是,该操作旨在更新现有文档,并且仅在找不到具有给定条件的文档时才添加文档
如果添加索引,则upsert
会变得更快:在所有索引都用于“查找”文档之后。注意事项在索引所操作的字段和要更新的字段中。如果更新的部分是索引的一部分,则会对更新文档的性能产生影响。如果更新的部分不是索引的一部分,则不会因写入现有文档而受到处罚。但是,如果添加文档,则会对性能产生较小的影响,因为索引集合是更新的。但是,仅仅添加一个文档仍然会更快
因此,如果在您的场景中您知道不想更新文档,那么插入通常会更快。如果要确保不添加同一文档两次,还可以选择添加唯一索引。然后,插入操作就会失败
总而言之,这取决于具体的场景,但根据我可以从您的问题中提取的信息,我认为最好的选择是简单地插入文档。由于您似乎确保“createdon”字段使文档在您的场景中是唯一的,因此您只需担心在读取场景中使用的索引
可在网站上找到一些额外信息:
有关设计(读取)索引的更多信息,可以找到关于索引是否向查询计划添加任何内容的非常好的解释:
我希望这有帮助。如果插入文档,Mongodb需要检查是否存在具有相同objectId的文档。如果其存在,则无法插入文档 同样的情况也适用于更新。它需要检查文档是否存在。否则无法执行更新。如果未根据ObjectId/索引字段查找文档,则更新查询将变慢 否则,插入/更新文档的性能应相同 例如 所以Insert可以是这样的//(Fast)
通常,索引仅用于加快读取速度。不写入。=>每次创建不同的文档:这将是一个很好的解决方案,具体取决于您添加文档的频率。如果文档数量在很短的时间内会很大,那么您的查找查询就会变慢。我不会使用此bcos,我在每个查询中都有订单文档。。。即使是我也必须得到一个文档。如果你有一个索引不是类型的Id怎么办ObjectId@eranotzap操作会像ObjectId字段一样快速。这就像什么都没说,你的意思是什么?@eranotzap ObjectId的插入、更新和删除等操作都很快,因为默认情况下它是索引的。因此,任何被索引的字段都可以像对象一样快速地插入、更新和删除。你不理解这个问题。我的意思是,如果我不使用ObjectId(类型)作为我的ID,那么用Date替换它并索引它。那也一样快。