2013-02-18 36 views
0

的場景是查詢的MongoDB - 使用限制VS重新查詢

  • 我查詢數據

  • 潛在過濾一些列的服務器端,因爲查詢究竟是(廢話!)不可能/合理的,即複雜的查詢

  • 該數據庫可能會承受相當大的負載。可能會有許多並行請求,包括更新。

所以,我可以

a)不限制()查詢,並只保留流數據,直到我得到足夠。但是,響應時間很重要,因此如果所需數據太稀疏,則可能必須在檢索整個頁面之前返回部分集。

b)使用limit(),但偶爾會重新查詢幾次,試圖檢索整頁數據。再次,最終的結果仍然可能不是一整套。這裏的想法是,製作一對額外的請求會減少數據庫的負載。

我知道這可能是一個「它取決於」,但我想知道是否有人對最佳實踐有一些洞察力或調整的最佳起點。

+0

你能分享一些代碼嗎? – 2013-02-18 20:49:54

回答

2

選項(a)會對您說已經承受相當大負載的數據庫增加額外的負載。原因是如果沒有限制,您的explain命令中的nscan可能很大,導致沉重的MongoDB服務器負載。在我看來,這將是一個非常糟糕的主意。

您可以使用limit,但要注意,簡單skiplimit獲得更多和更昂貴的skip尺寸的增加。從MongoDB的文檔:

不幸的是跳過即可(非常)昂貴,需要從集合,或索引的開始走的服務器上,去偏移/跳躍位置,纔可以開始返回的頁面數據(限制)。隨着頁面數量的增加,跳過將會變得更慢,並且CPU密集程度更高,並且可能會導致IO更大的集合。

基於範圍的分頁可以更好地使用索引,但不允許您輕鬆跳轉到特定頁面。

你真的找什麼是range based pagination,只要你有一個獨特的列,您可以使用排序並使用$lt$gt。有關如何實現基於範圍的分頁的另一個示例,請參閱here

+1

這在我的POV中是一個非常好的答案。 – gustavohenke 2013-02-18 21:22:35