【问题标题】:MySQL queries taking longer when response is empty响应为空时,MySQL 查询需要更长的时间
【发布时间】:2020-09-26 02:12:17
【问题描述】:

我正在使用 Node.js 作为网络服务器构建我的第一个网站,并获取对服务器的请求。当 MySQL 数据库从 localhost 运行时,我的请求每个请求不到 30 毫秒,并且网页没有问题。但是,当服务器托管在其他地方时,只有当查询的结果数据返回“[]”时,我才会得到很长的响应时间。我试图弄清楚为什么只有在从非本地主机数据库请求时才会出现这种情况(或者为什么通常会发生这种情况)。

查看这两个链接的响应时间差异:

{链接已删除}

{链接已删除}

您会看到返回 '[]' 的那个比另一个花费的时间要长得多。

这是使用的服务器端代码:

    router.get('/getgames/:matchid/:season', (req, res) => {
    let sql = `SELECT * FROM games WHERE match_id='${req.params.matchid}' AND season='${req.params.season}'`;
    let query = db.query(sql, (err, result) => {
        if (err) throw err;
        res.writeHead(200, { 'Content-Type': 'application/json' });
        res.end(JSON.stringify(result));
    });
});

我认为没有必要包含客户端代码,因为将请求放入 URL 栏中时所需的时间一样长。

同样重要的是要注意被访问的表少于 10 行,所以我认为索引/发布我的解释实际上不会解决这个问题(或者会吗??)。

编辑:我在“游戏”表中添加了覆盖索引,但查询仍然很慢。

感谢您的帮助。

【问题讨论】:

  • 你应该首先连接到这个mysql实例并执行两个查询,检查它们是否确实有不同的响应时间。
  • @enapupe 你提出了一个有趣的观点......当通过 phpMyAdmin 执行查询时,执行时间没有真正的差异(两者都 ~0.0005 毫秒)。这是否意味着问题在于响应处理?
  • 我的第一次尝试是用硬编码的空数组[] 替换stringify(result),看看会发生什么。但我不知道发生了什么。似乎 node/express 如何播放连接的那一端。标题似乎尽快到达,只是由于某种原因正文被延迟了
  • 尝试将end 替换为send,然后搜索keep-alive。似乎节点在发送正文并关闭连接之前正在等待某些东西
  • @enapupe 我实际上已经尝试用硬编码数组替换 stringify,但这并没有改变任何东西。但是,我对保持活动进行了一些研究,并在 res.end 之后使用 res.set("Connection", "close"),消除了奇怪的 5 秒延迟(使用 url 栏时)。然而,我在网站内的所有获取请求(之后使用此 res.set)都不起作用并返回 503 错误代码。嗯...有没有办法可以默认禁用keep-alive?

标签: javascript mysql node.js json express


【解决方案1】:

由于某种原因,我不确定,节点似乎在等待 keep-alive 关闭,然后再发送空数组主体。禁用keep-alive可以缓解这个问题,见https://nodejs.org/api/http.html#http_server_keepalivetimeout(keep-alive的默认超时时间是5s)

我想拥有更长的主体可以解决这个问题,这就是为什么它会立即返回具有实际 sql 结果的集合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多