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 在一个请求中执行两个或多个查询