2012-07-01 69 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