为什么在node-sqlite3中关闭和重新打开数据库会提高查询性能

时间:2017-04-12 18:54:06

标签: node.js sqlite

我的节点应用程序需要执行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
      });
     });
   });
});

有谁知道为什么会这样?

0 个答案:

没有答案