0

蒙古数据库:

1:集合如 {'num':1}{'num':2}{'num':3}{'num':4}

在我的程序中:

list=[1,2,3,4]
db.collection.find({'num':{"$in":list}})

for i in list:
    db.collection.find({'num':i})

这两种方法有什么区别(性能)吗?

如果我有这样的场景:collection 比如 collection1:{'num':1}{'num':2}{'num':3}{'num':4}

集合2:{'n':1}{'n':2}{'n':3}{'n':4}

nums=db.collection1.find()

1:

for num in nums:
    db.collection2.find({'n':num})

2:

list=[]
for num in nums:
    list.append(num)
db.collection2.find({'n':{"$in":list}})

这两种方法有什么区别(性能)吗?

4

2 回答 2

2

第一个将整个搜索查询一次发送到数据库,并在一个连接中搜索 [1,2,3,4]。

第二个打开连接,搜索 1,返回结果,然后通过网络返回,搜索 2,等等。这个应该更慢。

于 2012-07-01T13:57:39.533 回答
0

是的,一般来说,由于多种因素,您会产生差异:

  • 正如 Sergio 所观察到的,“一次通话”方法需要更少的网络往返。如果您的列表很大,网络速度较慢,并且会按顺序访问整个表,则此选项将运行得更快。
  • 另一方面,如果您正在搜索的字段上有索引,则单个查询将运行得更快。如果您有一个小列表、快速的网络和较慢的整体数据库访问,那么现在可能是第二个选项运行得更快。

根据实际发生的情况(即,如果您的集合中的文档也有巨大的有效负载,因此直接访问它们而不是通过索引访问它们会更昂贵;或者有多少记录;等等),您可能会遇到不同级别的性能,但你不能说一般来说哪种方法更方便。

此外,差异受数据库大小、是否分片等因素的影响。

坦率地说,在现实世界中的大型数据库上,我宁愿在不同的负载条件下运行几次这两个版本,然后……给它们计时。有太多因素在起作用,网络往返只是其中之一。

如果您正在设计一个系统,请仔细确定您的假设(包括增长和扩展)。很容易想出一个解决方案,当事情很小的时候运行得非常快,当数据库增长或者如果它可能被移动到云中时,它就会变成糖浆。

于 2012-07-01T14:02:22.973 回答