【问题标题】:Are MongoDB Stored JavaScript Procedures faster?MongoDB 存储的 JavaScript 过程更快吗?
【发布时间】:2020-08-24 12:54:40
【问题描述】:

我对存储的 JavaScript 过程有疑问。在阅读了 PointBeing 的Blog Entry 之后,我有一些问题。

  • 将我的代码存储在数据库中是否有好处?我的意思是像 lookups for documents 这样的函数,而不是像 PointBeing 中的例子那样的 adding numbers
  • MongoDB 存储 javascript 是否比 node.js javascript 更快?
  • MongoDB 存储的 javascript 查询是否已缓存,它们是否更快?

与 Node.js Javascript 相比,我对 MongoDB 存储的 javascript 性能感兴趣。

【问题讨论】:

  • 每个帖子保留一个问题。所以不允许同时问 4 个问题。
  • @Salvador 这些问题都密切相关,我认为将它们分成三个单独的帖子没什么意义。
  • 1:不,2:不,3:当然不是
  • 这会阻止人们回答您的问题 如果我只知道 2 个问题的答案,或者只知道一个问题怎么办。而且第一个问题是主观的和模棱两可的。 real advantage 取决于许多因素,并且由于开发中的大多数事物没有优势,因此需要权衡取舍。

标签: javascript node.js mongodb stored-procedures


【解决方案1】:

不推荐使用存储在 db.system.js 中的评估函数(“存储过程”,当您想这样称呼它们时)。 db.eval shell functionthe eval database command 上的文章有“自 3.0 版起已弃用”警告,the article on server-sided javascript 不再提及。所以你应该避免使用它。一个原因是您在使用分片时无法运行 javascript 函数。因此,当您构建需要 eval 的应用程序时,您会阻止它在未来扩展。另一个是javascript函数破坏了权限概念。他们总是需要以管理员身份运行,这使得建立健全的权限系统变得不可能。考虑到使用用户提供的数据的服务器端脚本可能容易受到任意脚本注入的影响,从安全角度来看,这尤其成问题。

服务器端 javascript 的优势在于它在数据库服务器上运行。当您需要执行大量查询时,这可以减少应用程序服务器和数据库服务器之间的延迟。但是您可以通过在数据库服务器上打开一个 mongo shell 并在那里执行它来获得相同的优势。

延迟优势仅在您从脚本执行多个查询时才相关。当您只有一个查询时,调用脚本时仍然会有延迟。所以除了不必要的复杂性,你什么也得不到。

服务器端 javascript 没有额外的缓存或其他优化。更糟糕的是:每次运行它都会被重新解析和重新解释。所以它甚至可能比应用服务器中的 javascript 慢。

此外,许多需要脚本支持才能仅使用 find() 实现的复杂查询通常可以使用 aggregation 表达,这在大多数情况下比使用 find() 和 javascript 执行相同的操作要快得多,因为聚合框架用 C++ 实现,可以访问原始 BSON 文档。

【讨论】:

  • 当查询涉及 MongoDB 集合之间的大量准连接时,使用 MongoDB C# 驱动程序版本 1.7.0.4714 API 很难实现查询。我相信,如果您将 MongoDB 世界中的大量数据作为列表中的 POCO 对象引入 C# 世界,它会降低性能。所以,我在想如果采用使用 C# 来调用存储在 MongoDB 中的 JavaScript 的实现实践是否会更好。你是说调用存储的 JavaScript 是不好的。请看:stackoverflow.com/questions/36220272/…
  • @CSLewis 当你需要做大量的准连接时,你很有可能把 mongodb 当作一个关系数据库来使用,它很少能得到好的结果。
  • 好的,但是,如果我只是对包含大量数据的集合进行大量分析会怎样。我认为通过从集合中引入大量文档作为 C# 世界中的 C# POCO 对象会降低性能。相反,我认为如果 C# 调用 Stored JavaScript 会更好,它会进行大量深入分析,然后将最终结果返回给 C# 世界。我还有什么其他选择?
  • @CSLewis 我用 MongoDB 构建了一个系统,它在 C# 代码中连接许多查询的结果,一次有几千条记录。不是 MongoDB 的真正用途,但使用聚合管道可以有效地完成它,并授予对 mongo 可伸缩性的访问权限,而无需支付昂贵的 SQL 服务器费用。关键是拥有正确的索引并确保它们在您的查询中得到使用,然后确保处理记录的 C# 代码高效(使用字典而不是列表进行查找等)。
  • @Philipp 感谢您的回答。它消除了我对 MongoDB 的一些误解。
【解决方案2】:

搞笑的是那篇博文 (http://pointbeing.net/weblog/2010/08/getting-started-with-stored-procedures-in-mongodb.html) 是在 JS 只使用单线程全局锁的时候写的。

这意味着没有并发特性或更细粒度的锁与之关联(锁仍然是一个问题,并发只能通过多个隔离来实现)。仅仅因为您在一些随机的博客文章中看到它并不意味着应该使用它。

直接回答您的问题:

  1. 不。事实上,缺点是调用用户需要完全的管理员权限。这意味着您将每一个权限都授予您的网络用户,因为内置的 JS 引擎对所有内容都有挂钩,包括管理功能,因为它需要管理员权限才能运行。

  2. 在 JS 中调用 JS 从 JS 到 JS 再到 C++?没有

  3. 不,MongoDB 缓存不能那样工作。我建议您阅读基础文档:http://docs.mongodb.org/manual/faq/fundamentals/

【讨论】:

    猜你喜欢
    • 2018-01-02
    • 2012-06-09
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    相关资源
    最近更新 更多