为什么在 Node JS 中执行的 Mysql 查询比直接执行 Mysql 查询要慢得多?

6
查询: select id, event_time from events where event_time > 1395797406712 and event_time < 1398389406712 order by event_time asc.
这个查询返回约25k行(总大小500KB)。
当我在Node.js中使用node-mysql驱动程序进行上述查询时,需要3-4秒才能执行。(我使用了console.time和console.timeEnd)
当我直接在mysql中查询时,它说需要大约200毫秒。
什么原因导致了如此大的差异,我该如何改进Node.js实现以与直接的Mysql查询相一致?

1
node-mysql2 应该更快。它添加了一些性能技巧,目前 node-mysql 还没有实现。你应该试一试。 - mscdex
Node应用程序必须从数据库接收数据。你的结果集有多大?你需要所有的25k行吗?限制你的结果也可能有所帮助。我对你的发现很感兴趣,到目前为止是个好问题。 - clay
@clay 结果集的大小为500KB。我需要所有25k行,因为我想对其进行一些复杂的计数,而我不确定如何在SQL中完成。 - goodspeed
2个回答

2
原来问题出在亚马逊后端。我们正在使用弹性豆荚,EC2和RDS实例位于同一地区但不在同一可用区域。一旦我将它们设置为相同的,即us-east-1a,node.js中的查询大约需要~200毫秒。

我有同样的问题。但是对我没有用。我还发现当我从两个不同的地方同时运行两个查询时,mysql的响应时间会慢两倍。这是我的问题:http://stackoverflow.com/questions/32308980/mysql-query-slows-down-when-another-query-is-concurently-sent 你能帮我吗? - Nikolay Traykov

0

你正在使用 行流式传输 吗?

如果没有,node-mysql 将会构建一个包含 25k 元素的对象,并带有所有相应的分配、迭代和赋值。由于 node-mysql 是纯 JavaScript,所以它是在 JavaScript 中执行(而不是精心优化的本地代码)。

行流式传输可以让你一次收集一条记录的信息,就像你在大多数其他环境中看到的传统基于游标的 MySQL 适配器一样。


我尝试使用行流处理,但执行时间仅减少了约1秒,远远达不到应该花费的200毫秒。 - goodspeed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接