Node MySQL 以最快的速度执行多个查询

Posted

技术标签:

【中文标题】Node MySQL 以最快的速度执行多个查询【英文标题】:Node MySQL execute multiple queries the fastest possible 【发布时间】:2017-05-21 15:42:41 【问题描述】:

哪种方法最快将查询获取到mysql,然后返回输出:

console.log('查询完成', 结果)"

还有更好的方法吗?请解释你的答案!

谢谢!

方法一:

var connection = mysql.createConnection(multipleStatements: true);

connection.query('SELECT ?; SELECT ?', [1, 2], function(err, results) 
  if (err) throw err;

  console.log('queries done', results);
);

方法二:

const Db = mysql.createPool(
    connectionLimit: 7,
    dateStrings: true,
    multipleStatements: true
);

Db.getConnection(function(err, connection) 
    if(err) console.log(err);

    connection.query(`
        SELECT "1" AS "first";
        SELECT "2" AS "second";`, function(err, results) 
            connection.release();

            if(err) console.log(err);
            console.log('queries done', results); 
                            

    );

);   

方法三:

const Db = mysql.createPool(
    connectionLimit: 7,
    dateStrings: true,
    multipleStatements: true
);

Db.getConnection(function(err, connection) 
    async.parallel([
        function(callback) 
            connection.query(`
                SELECT "1" AS "first"`, function(err, done) 
                    callback(err, done);
                
            );                 
        ,

        function(callback) 
            connection.query(`
                SELECT "2" AS "second"`, function(err, done) 
                    callback(err, done);
                
            );                
        
    ], function(err, results) 
        connection.release();
        if(err) console.log(err);

        console.log('queries finished', results);
    );
);

方法四:

const Db = mysql.createPool(
    connectionLimit: 7,
    dateStrings: true,
    multipleStatements: true
);

async.parallel([
    function(callback) 
        Db.getConnection(function(err, connection) 
            connection.query(`
                SELECT "1" AS "first"`, function(err, done) 
                    connection.release();
                    callback(err, done);
                
            );
        );
    ,
    function(callback)   
        Db.getConnection(function(err, connection) 
            connection.query(`
                SELECT "2" AS "second"`, function(err, done) 
                    connection.release();
                    callback(err, done);
                
            );
        );
    
], function(err, results) 
    if(err) console.log(err);
    console.log('queries finished', results);
); 

而且我没有发布,但是方法 3 和 4 也可以在没有连接池的情况下完成。还有关于使用 npm 模块异步的承诺,什么是最快的,为什么!?谢谢。

【问题讨论】:

您可以很简单地使用console.time('query')console.timeEnd('query') 自己解决这个问题。我建议每个方法至少运行 10 次以获得平均值。它应该会给你你正在寻找的答案。 我不知道这个!!太棒了。 【参考方案1】:

方法 1 和 2 类似,只是如果池中的所有连接都被使用,Pool 会创建一个连接。

要确定哪个更快,您需要了解应用服务器和数据库服务器之间的计算能力与网络带宽。

原因如下:

在方法 1 和 2 中,您使用单个连接来执行多个查询。如果数据库机器的处理能力比发送/接收多个查询的网络带宽更快,那么方法 1 和 2 更有效。如果数据库机器的处理能力比带宽慢(例如应用程序/mysql服务器都在同一台机器上),那么方法3和4理论上会更快。

另一个因素是语句是否相互依赖。因为第 1 步和第 2 步本质上是同步运行语句,所以整个操作集是原子/一致操作。对于方法 3 和 4,虽然它们是并行触发的,但它们是异步运行的,因此可能存在后面的语句比前面的语句更早完成的情况。如果发生这种情况并且存在依赖关系,方法 3 和 4 将损坏您的数据。

TL;DR

快速 + 同步(插入/更新,然后选择结果)= 方法 1、2(使用池化减少打开新连接的需要) 快速 + 异步(批量插入)= 方法 3、4 应用程序/数据库服务器之间的连接缓慢 = 方法 1,2

【讨论】:

【参考方案2】:

在我的应用程序中使用 3 个实际查询的上述四个选项中,每个执行大约需要 1-3 秒,对于任何感兴趣的人来说,方法 3 最终是最快的。

方法 1 和 2 慢了大约 1/2 秒,方法 4 只是稍微慢了一点。

编辑:我使用上面 cmets 中的 console.time('query') 建议进行了这些基准测试。

【讨论】:

以上是关于Node MySQL 以最快的速度执行多个查询的主要内容,如果未能解决你的问题,请参考以下文章

使用 node-mysql 和 ExpressJS 在一个请求中执行两个或多个查询

node.js,express - 在循环中以同步方式一个接一个地执行mysql查询

使节点mysql运行最快的最佳技术?

php + mysql - 性能 - 即时自动完成响应

如何提高mysql查询速度

MySQL中like查询速度慢的问题