我的节点应用程序需要执行3个查询,每个查询都取决于之前的结果。所以我将它们放入回调中,简化的代码结构如下:
var express = require('express');
var sqlite3 = require('sqlite3').verbose();
var app = express();
var db = new sqlite3.Database('data.db');
app.get('/api/v1/data', (req, res) {
db.all(query1, function (err, rows) {
// get data from rows assuming has data
db.all(query2, function (err, rows) {
// do stuff
db.all(query3, function (err, rows) {
// do last bit of stuff
});
});
});
});
事实证明query2
总是慢于其他两个,即使预期的复杂性是:
query1 < query2 < query3
我已经根除了索引问题,因为在sqlite3
桌面应用程序(数据库浏览器和Valentino Studio)中独立执行时,订单是预期的。
但是我在执行close
之前插入了open
和重新query2
操作,并且提升了query2
的效果。
var express = require('express');
var sqlite3 = require('sqlite3').verbose();
var app = express();
var db = new sqlite3.Database('data.db');
app.get('/api/v1/data', (req, res) {
db.all(query1, function (err, rows) {
// get data from rows assuming has data
// The magic "reopen" speeds up query2 significantly
db.close();
db = new sqlite3.Database('data.db');
db.all(query2, function (err, rows) {
// do stuff
db.all(query3, function (err, rows) {
// do last bit of stuff
});
});
});
});
有谁知道为什么会这样?