2017-01-06 112 views
1

这是最快的方法获取查询到MySQL,然后再回来输出:节点的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

你可以很简单地计算出这个你自我使用'console.time('query')'和'console.timeEnd('query')'。我会建议运行每种方法至少10次以获得平均值。它应该给你你正在寻找的答案。 – Molda

+0

我不知道这个!真棒。 – user2278120

回答

0

方法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只稍微慢了一点。

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