2011-02-10 104 views
32

在MongoDB中使用$ in操作符的緩慢/糟糕的形式是否有很多可能性?

posts.find({ 
    author : { 
     $in : ['friend1','friend2','friend3'....'friend40'] 
    } 
}) 

應用程序引擎,例如,不會讓因爲他們的陣中翻譯每件直接到一個查詢,所以不是強迫你使用他們的方法來處理fan out您使用超過30。雖然這可能是Mongo中最有效的方法,但它的代碼顯得更加複雜,所以我寧願只使用這種泛型方法。

對於合理大小的數據集,Mongo會有效地執行這些$查詢嗎?

+0

你在你的作者領域有一些索引嗎? – shingara 2011-02-10 10:08:04

+0

你好@Derek Dahmer,你能解決這個問題嗎?我一直在處理這個問題。這名建築師今天命名爲Edge Collection by MongoDB :)我也希望使用$ in參數和巨大的數組。但我提防性能影響! http://image.slidesharecdn.com/socialitept2-140724104718-phpapp01/95/socialite-the-open-source-status-feed-part-2-managing-the-social-graph-18-638.jpg?cb= 1406222239 – efkan 2015-02-09 13:48:43

回答

18

對於$ in,它可以相當有效地處理小列表(很難說小是什麼,但至少是幾十/幾百)。它不像app-engine那樣工作,因爲mongodb具有實際的btree索引,而不是像bigtable那樣的列存儲。

如果沒有要使用的索引,使用$就可以在索引中跳過以查找匹配的文檔,或遍歷整個集合。

3

假設已創建的author字段索引,從算法點,$in操作的時間複雜度爲:$(N*log(M)),其中N是輸入陣列的長度和M是集合的大小。

$in操作的時間複雜度,除非你改變一個數據庫(雖然我不認爲任何數據庫可以打破O(N*log(M)))將不會改變

但是,從工程角度來看,如果N達到一個大數字,最好讓您的業務邏輯服務器通過批量或逐個模擬$in操作。

這只是因爲:數據庫服務器中的內存比業務邏輯服務器中的內存更有價值。