2011-03-01 67 views
17

從關係數據庫背景來看,我總是有這樣的印象:「儘可能努力地使用一個查詢,假設它是有效的」,這意味着對數據庫提出的每個請求都是昂貴的。說到MongoDB,看起來這可能是不可能的,因爲你無法加入表格。每個請求可以多次查詢MongoDB嗎?

我知道它不應該是關係型的,但它們也在推動它用於博客,論壇和我會發現RDBMS更容易處理的目的。

有一些掛機,我一直試圖理解MongoDB或NoSQL的效率。如果我想獲得與某些用戶相關的所有「帖子」(就好像他們被分組了一樣)......使用MySQL,我可能會做一些連接,並用它來獲得它。在MongoDB中,假設我需要單獨的集合,使用大型$ in:['user1','user2','user3','user4',...]是否會很高效?

這種方法在一段時間後變慢了嗎?如果我包含1000個用戶? 如果我需要得到與用戶相關的X,Y,Z帖子說名單,將它使用的MongoDB這樣做是有效的和/或快速:

  • 獲取用戶陣列
  • 獲取帖子的用戶陣列

2查詢一個請求。在NoSQL中這是不好的做法嗎?

回答

33

要回答■關於$的....

我做了下面的情況下一些性能測試:基於一百萬這些文件的

〜2400萬頁的文檔集合中
查詢一鍵(索引)
從.NET

使用CSHARP駕駛員結果:
查詢1的時間,單線程:109S
同時查詢1,多線程:48S
查詢100K在同一時間使用$,單線程= 20S
查詢100K在同一時間使用$,多線程= 787-9

那麼明顯好轉性能使用大$ in(限於最大查詢大小)。

更新:

查詢10在同一時間(100000個批次)= 8.8S
查詢100:
約$如何與不同的塊大小執行(查詢多線程)下面的評論繼(10000批次)= 4.32s
一次查詢1000(1000批次)= 4.31s
一次查詢10000個(100批次)= 8.4s
一次查詢100000(10批次)= 9s(以上每個原始結果)

所以看起來確實有多少值可以批量加入到$ in子句中,往返次數

+1

這裏主要的性能差異是每個查詢的開銷; $ in的效率更高,因爲它只針對結果進行一次往返服務器而不是N + M。 – 2011-03-01 16:50:51

+2

@AdaTheDev:如果你很容易做到這一點,我認爲從單一和多線程的重複「X一次性使用$ in」的實驗來看,$是多少比例是非常有趣的,其中X是10,然後是20,然後是30,然後是100。 – 2011-03-01 19:56:40

+3

@Lucas Zamboulis - 請參閱上面的更新。我可能會以博客文章的形式做更多的工作,更詳細 – AdaTheDev 2011-03-04 16:05:10

相關問題