簡體   English   中英

MongoDB 存儲 JavaScript 過程更快嗎?

[英]Are MongoDB Stored JavaScript Procedures faster?

我對存儲的 JavaScript 過程有疑問。 在閱讀了 PointBeing 的博客條目后,我有一些問題。

  • 將我的代碼存儲在數據庫中是否有優勢? 我的意思是lookups for documents類的功能,而不是像 PointBeing 中的示例那樣adding numbers
  • MongoDB 存儲 javascript 比 node.js javascript 快嗎?
  • MongoDB 存儲的 javascript 查詢是否被緩存,它們是否更快?

與 Node.js Javascript 相比,我對 MongoDB 存儲的 javascript 性能感興趣。

評估存儲在 db.system.js 中的函數(“存儲過程”,當您想調用它們時)已被棄用。 有關db.eval shell 函數eval 數據庫命令的文章有“自 3.0 版起已棄用”警告,而有關服務器端 javascript 的文章不再提及。 所以你應該避免使用它。 原因之一是使用分片時無法運行 javascript 函數。 因此,當您構建需要 eval 的應用程序時,您可以防止它在未來擴展。 另一個是 javascript 函數破壞了權限概念。 它們總是需要以管理員身份運行,這使得無法建立健全的權限系統。 考慮到使用用戶提供的數據的服務器端腳本可能容易受到任意腳本注入的攻擊,從安全角度來看,這尤其成問題。

服務器端 javascript 的優點是它運行在數據庫服務器上。 當您需要執行大量查詢時,這會減少應用程序服務器和數據庫服務器之間的延遲。 但是您可以通過在數據庫服務器上打開一個 mongo shell 並在那里執行它來獲得相同的優勢。

延遲優勢僅在您從腳本執行多個查詢時才相關。 當您只有一個查詢時,調用腳本時仍然會有延遲。 因此,除了不必要的復雜性之外,您一無所獲。

服務器端 javascript 沒有額外的緩存或其他優化。 更糟糕的是:每次運行它都會被重新解析和重新解釋。 因此,它甚至可能比您的應用程序服務器中的 javascript 還要慢。

此外,許多需要腳本支持才能僅使用find()實現的復雜查詢通常可以使用聚合表示,這在大多數情況下比使用find()和 javascript 執行相同操作要快得多,因為聚合框架是用 C++ 實現的,並且可以訪問原始 BSON 文檔。

搞笑的是那篇博文( http://pointbeing.net/weblog/2010/08/getting-started-with-stored-procedures-in-mongodb.html )是在JS只使用單線程全局鎖的時候寫的。

這意味着沒有並發特性或更細粒度的鎖與之相關(鎖仍然是一個問題,並發只能通過多個隔離來實現)。 僅僅因為你在一些隨機的博客文章中看到它並不意味着它應該被使用。

直接回答您的問題:

  1. 不。 事實上,缺點是調用用戶需要完全的管理員權限。 這意味着您將每個權限都授予您的 Web 用戶,因為內置的 JS enigne 具有適用於所有內容的鈎子,包括管理功能,因此它需要管理員權限才能運行。

  2. 在 JS 中從 JS 調用 JS 到 JS 到 C++?

  3. 不,MongoDB 緩存不能那樣工作。 我建議您閱讀基礎文檔: http : //docs.mongodb.org/manual/faq/fundamentals/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM