节点MySQL尽可能快地执行多个查询

时间:2017-01-06 19:41:59

标签: mysql node.js node-mysql async.js

哪个是最快的方法获取查询到MYSQL,然后返回输出:

  

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

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

谢谢!

方法1:

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

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

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

方法2:

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); 
        }                    

    );

});   

方法3:

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);
    });
});

方法4:

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模块异步的承诺,最快的是什么,为什么!?谢谢。

2 个答案:

答案 0 :(得分:2)

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

方法1和2约慢了整整1/2秒,而方法4只是略微慢一点。

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

答案 1 :(得分:1)

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

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

原因如下:

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

另一个因素是这些陈述是否相互依赖。因为步骤1和2基本上同步运行语句,所以整个操作集是原子/一致操作。对于方法3和4,因为它们是异步运行的,尽管它们是并行触发的,但是可能存在后面的语句比早期语句更早完成的情况。如果发生这种情况并且存在依赖性,方法3和4将破坏您的数据。

<强> TL; DR

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