2017-03-05 65 views
-1

我有以下問題連接到MongoDB數據庫設計。這裏是我的情況:MongoDB:什麼是更快:單個find()查詢或許多find_one()?

  • 我有大約50K的文檔集合(15KB每)
  • 每一個文件都有一本字典存儲的數據樣本,
  • 我的查詢總是會從文檔中的所有數據,
  • 每個查詢使用一個索引,
  • 集合只有一個索引(基於單個日期時間字段),
  • 在大多數情況下,我需要從許多文件(通常爲25 <ñ數據100),
  • 很容易,我在一個單一的一個執行許多SELECT查詢,
  • 我有很多我的數據庫更新,比SELECT的人少得多的,
  • 我使用WiredTiger引擎(最新版本的MongoDB),
  • 服務器實例和web應用程序在同一臺機器上。

我有兩個可能性,使一個SELECT查詢:

  • 執行一個查詢檢索我感興趣的所有文件,
  • 進行N次查詢,每個人都有一個單一的文件,其中一般爲25 <ñ< 100(怎麼樣不同的場景時,100 <ñ< 1K或1K <ñ< 10K?)

所以問題是當我在單個執行很多小的查詢時是否還有額外的開銷?在關係數據庫中進行許多查詢是非常糟糕的做法 - 但在NoSQL中?我在詢問一個普遍的做法 - 我應該避免這麼多疑問嗎?

在文檔中,我讀到查詢的數量並不重要,但對文檔的搜索次數是真的嗎?

感謝您的幫助;)

回答

1

有像你問一個類似的問題:Is it ok to query mongodb multiple times

IMO,爲您的使用情況,即25<N<100,一個絕對應該與配料去。

在單一的查詢的情況下:

  • 在一個單獨的線程循環是不夠的,你必須讓這會產生額外的開銷
  • 並行請求爲每個請求
  • 創建TCP/IP開銷
  • 對於每個查詢創建和耗盡遊標都有一定的設置和拆卸,這會產生不必要的開銷。

正如在上面的答案中所解釋的那樣,似乎有一個甜點可以批量添加多少個值,也可以根據您的文檔類型進行往返次數。

從更廣泛的角度來看,任何10<N<1000都應該使用批處理,其餘記錄應該形成其他批處理的一部分,但是一次查詢單個文檔肯定會產生不必要的開銷。

1

,當你在一個查詢中執行小型查詢的問題是網絡開銷是網絡延遲往返。

對於批量處理中的單個請求,它可能並不多,但是如果您做出這樣的多個請求或在前端使用此技術,則會降低性能。

此外,您可能需要預處理數據,如手動排序聚合。

相關問題