2012-07-01 66 views
0

的MongoDB:两个区别mongodb查询?

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}) 

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

如果我有这样的场景: 收集如 collection1:{ 'NUM':1} { 'NUM':2} { 'NUM':3} { 'NUM':4}

collection2 :{ '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}}) 

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

+0

第二个应该更慢(更多网络往返)。 –

+0

谢谢,但我想知道性能的差异可能很大?我想知道它们之间的数据库压力? – Wahaha

+0

的区别取决于您在数据库,网络等方面的实际数据。 –

回答

2

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

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

0

由于各种因素是,一般你会得到不同:

  • “一个呼”方针必须由塞尔吉奥,更少的网络往返观察。如果您的列表很大,网络速度较慢,并且会按顺序访问整个表格,则此选项将运行得更快。
  • 另一方面,如果您在搜索字段上有索引,则单个查询将运行得更快。如果你有一个小列表,快速网络和缓慢的整体数据库访问,那么现在它是第二个可能运行得更快的选项。

根据实际发生的事情(即,如果在您的收藏中的文档也是巨大的载荷,因此访问它们直接而不是通过指标较为昂贵;或者有多少记录有;等等),你可能会遇到不同程度的表现,但是你不能总体说哪种方法更方便。

此外,差异受数据库大小的影响,无论您是否分片,等等。坦率地说,在现实世界中的大型数据库中,我宁愿在不同的负载条件下运行两次版本,并且......将它们计时。太多因素在起作用,网络往返只有一个。

如果您正在设计一个系统,请仔细放样您的假设(包括增长和缩放)。想出一个解决方案很容易,当事情很小时,它可以非常快速地运行,并且在数据库增长或者可能迁移到云时变成糖蜜。

+1

这是不正确的。指数将用于这两种情况。没有一种情况下我能找到更快的多个查询。 –

+0

Thanks.can你帮我换第二场? – Wahaha