为啥 Node.js 的 Mysql Native 驱动程序的查询执行时间如此之长?有啥选择吗?

Posted

技术标签:

【中文标题】为啥 Node.js 的 Mysql Native 驱动程序的查询执行时间如此之长?有啥选择吗?【英文标题】:Why is query execution time so high for Mysql Native driver for node.js? Any alternatives?为什么 Node.js 的 Mysql Native 驱动程序的查询执行时间如此之长?有什么选择吗? 【发布时间】:2017-09-19 17:52:57 【问题描述】:

为什么在为 Nodejs 使用 mysql 本机驱动程序时,即使使用或不使用“创建池”选项,相同的查询比实际执行时间多大约 300 毫秒

请参考下方截图中突出显示的部分

还有原生驱动的执行时间,请看下面的截图:

node.js Mysql Native 驱动的代码库

db.js

var mysql = require('mysql');
var connectionpool = mysql.createPool(
    connectionLimit: 100, //important
    host: 'localhost',
    user: config.development.username,
    password: config.development.password,
    database: config.development.database,
    multipleStatements: true,
);

    exports.getConnection = function(callback) 
        connectionpool.getConnection(callback);
    ;

emp.js

var connections = require('../config/db');
     var pre_query = new Date().getTime();
        var sqlstatements = "select  * from employees where recordstate<>'raw'and  DATE(createdAt) " + "between ('1982-03-24') and ('2017-04-23')    order by employeesID desc limit 20 offset 0;" + "select COUNT(*) as count   from employees where recordstate<>'raw'and  " + "DATE(createdAt) between ('1982-03-24') and ('2017-04-23')    order by employeesID desc";
        connections.getConnection(function(err, c) 
            console.log(sqlstatements)
            c.query(sqlstatements, function(err, projects) 


                console.log(err);
                if (!err) 
                    c.release();

                    var red = new Object();
                    red.rows = JSON.parse(JSON.stringify(projects[0]));
                    red.count = JSON.parse(JSON.stringify(projects[1]))[0].count;
                    var post_query = new Date().getTime();
                    // calculate the duration in seconds
                    var duration = (post_query - pre_query) / 1000;
                    console.log(duration)
                        // console.log(red);
                    res.json(red);

                
            )
        )

【问题讨论】:

【参考方案1】:

您在 JS 中的测量包括连接设置和结果的所有处理。 MySQL Workbench(和 MySQL 终端客户端)中报告的时间只是服务器报告的时间(运行查询和结果传输)。单独的连接设置可能需要 300 毫秒的大部分时间。尝试在运行实际查询之前将 pre_query init 移动到该行。然后直接结束时间测量(在console.log(err) 调用之前。这提供了与其他客户端工具报告的结果相当的结果。

【讨论】:

感谢您的澄清,1. 建立 TCP 连接的时间 2. 与 MySQL 服务器握手 3. 执行身份验证和设置设置。包括上述因素在内的 mysql 数据库和 nodejs mysql 本机驱动程序中查询执行的暂定比率是多少?比率示例:- mysql 数据库中 1 毫秒,nodejs 对象中 2 毫秒 由于原生驱动程序的整体架构应该缩小两个关键部分之间的执行时间差距 在空闲时间后查询运行速度也变慢了,然后 n 次要快很多,在这种情况下会有什么建议。非常感谢 连接建立时间取决于许多因素(服务器负载、连接速度、配置等)。很难为此给出任何固定比率,但请记住,客户端工具通常连接到服务器并在应用程序的整个生命周期内(或至少直到服务器会话关闭)保持该连接。然后所有后续查询都针对此保持的连接运行。关于更慢/更快的查询执行时间:服务器中有一个查询缓存,可以将执行的查询保持一定的时间,因此可以更快地回答。可能这就是你所看到的原因。 感谢您提供进一步复杂的解释,但请考虑以下因素。一个案例场景,其中单个用户负载,数据库和应用程序在同一台机器和配置上是非常标准的,没有外部选项,如故障转移或任何有问题的 RDBMS 的复杂用户访问管理。第一次或空闲连接后仍然存在延迟,这是在第二部分和第二部分解释了查询缓存,我有一个有根据的猜测,只是想从 MVP 确认!感谢您的时间和澄清! 简而言之,如何优化第一次和空闲时间后的查询性能?我的机器配置。 cloud.githubusercontent.com/assets/1698139/25309975/…

以上是关于为啥 Node.js 的 Mysql Native 驱动程序的查询执行时间如此之长?有啥选择吗?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Node.js 会以这种方式执行?

node.js 连接本地mysql8.0版本出现的问题 window系统

带有 C/C++ 和 nw.js/node.js/node-native-module (C++) 的终端服务器上的 IPC?

MongoDB Native Node.js Driver

React-Native - 使用依赖于 node.js 核心模块的 Javascript 模块

从 React Native 为 Node.js 使用 easymidi