mysql - MySQL 存储过程 vs Node.js 性能
问题描述
我有一个带有 Express/Node.js 和 MySQL DB 的 API。我正在使用 Mysql2 npm 包(无 ORM)进行查询。对于某些特定路线,我有一些并行运行的查询(它们并不完全相关,因此无法执行连接)。我想知道使用存储过程是否可以提高我的性能,尤其是考虑到 Node.js 的非阻塞行为。我主要关心2个参数:
- 查询时间和
- 服务器开销。
换句话说,如果我从单个查询更改为存储过程,对我的响应时间和服务器利用率会有什么影响?
编辑:
我所说的并行运行查询的意思是,我设置了一个函数,以便查询可以独立运行(无需等待前一个查询的响应),并且一旦所有承诺解决,我的函数将结果作为承诺返回。解决。
一个小片段:
const makeThreeQueries = (q1, q2, q3) => { # queries being array with 2 elements: ['query string', ['Array', 'of', 'Args']]
return new Promise((resolve) => {
const results = []
const queryHandler = (result) => {
results.push(result)
if (results.length === 3) resolve(results) # 3 in case there are 3 queries
}
db.query(...q1).then(queryHandler)
db.query(...q2).then(queryHandler) # doesn't wait for q1 to finish
db.query(...q3).then(queryHandler) # doesn't wait for q2 to finish
})
}
当然,主代码比这更健壮,有适当的错误处理和验证/位置一致性。
解决方案
有一些节省,因为控制保留在存储过程中,而不是需要在客户端和服务器之间来回切换。
如果客户端和服务器位于地理上相距很远的不同服务器上,则节省的费用非常可观。在这种情况下,传输时间可以支配性能。
无论代码是来自客户端还是来自存储过程,并行性可能需要仔细注意事务——以防止单独的操作相互影响。
推荐阅读
- symfony4 - 如何从 symfony4 中的 ChoiceType 字段中打印所选项目的数量?
- javascript - 插入另一个项目后 actionEventListener ("click") 不起作用
- c# - 有没有办法将图像和字符串变量存储在一个数组中?(统一)
- django - Django Emailfield 固定后缀
- query-optimization - SPARQL DBPedia 查询座位容量、优化和删除重复项
- javascript - 为什么我的代码将提示发送到我的手机,而不是发送给尝试向机器人发送消息的任何其他人?
- arrays - Ada:添加新元素时修改数组长度
- django - Django如何按多个字段分组并求和
- php - PHP MVC - 所有控制器的一个视图类与每个控制器的视图类
- regex - 如何编写 unix 正则表达式以选择 cp for 循环中的特定文件