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

Node MySQL execute multiple queries the fastest possible

最快的方法是查询 MYSQL,然后返回输出:

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

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

谢谢!

方法一:

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

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

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

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

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

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

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

原因如下:

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

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

TL;DR

  • 快速 + 同步(insert/update,然后 select 结果)= 方法一、二(使用池化减少开启新连接的需要)
  • 快速 + 异步(批量插入)= 方法 3、4
  • application/database 服务器之间的连接速度较慢 = 方法 1,2