最近,我注意到在执行多个上层服务器(通过散装作业)与插入(多个文档)之间存在着巨大的性能差异。我想知道我在这方面是否正确:
find()和update(),因此它可以执行两项读写操作那么性能的差异呢?
如果是这样的话,我想知道我是否需要大量的定期写入,而不是更新一个文档,而是用一个createdOn字段编写一个新文档。然后,为了进行查询,我将只查询按createdOn DESC排序的文档。我想知道这是不是个好方法?还是有更好的方法?
发布于 2017-01-16 04:11:02
如果要插入文档,MongoDB需要检查具有相同ObjectId的文档是否存在。如果存在,则无法插入文档。
同样的情况也适用于更新。它需要检查文档是否存在。否则,无法执行更新。当更新查询无法根据ObjectId / indexed字段找到文档时,更新查询就会减慢。
否则,插入/更新文档的性能应该是相同的。
所以插入可以像这样//(快速)
并使用向上插入更新(ObjectId可用)//(快速)
或者用向上插入更新(没有ObjectId) //这很慢
发布于 2016-12-17 16:17:14
我还没有找到关于upsert如何在MongoDB中工作的“正式”解释,但可以肯定地假定,因为操作的目的是更新现有文档,并且只有在无法找到具有给定条件的文档时才添加文档。
如果您添加了一个索引,那么upsert会变得更快:在所有索引被用来“查找”文档之后。注意事项在索引操作的字段和您正在更新的字段中。如果更新的部分是索引的一部分,则将对更新文档产生性能影响。如果更新的部分不是索引的一部分,则不会因在现有文档中写入而受到惩罚。但是,如果添加了文档,则会对性能产生较小的影响,因为索引集合是更新的。但是,尽管如此:仅仅添加一个文档仍然会更快。
因此,如果在您的场景中您知道您不想更新文档,那么插入通常会更快。如果要确保不添加同一文档两次,也可以选择添加唯一索引。那么插入就会简单地失败。
总之,这取决于具体情况,但根据我可以从您的问题中提取的信息,我认为最好的选择是简单地插入文档。因为您似乎要确保“createdon”字段使文档在您的场景中是唯一的,所以您只需担心在读取场景中使用的索引。
一些额外的信息可以在MongoDB站点上找到:
有关设计(阅读)索引的更多信息,可以找到关于查找索引是否向查询计划添加了任何内容的相当好的解释:这里。
我希望这能帮到你。
https://stackoverflow.com/questions/35112836
复制相似问题