0

对于仪表板,我需要显示多个帐户的每小时和每日请求。

后端是node.js,使用的是bettersqlite3库。

请求通过 requests 表记录:

var stmt = db.prepare('INSERT INTO requests (account,requestType,timestamp) VALUES(?,?,?)');
stmt.run(account,requestType,moment().format('YYYY-MM-DD HH:mm:ss'));

为了在仪表板中显示它们,我每 10 秒执行一次数字计算:

  var result = db.prepare("SELECT user,(SELECT count(requestID) as hourlyAmount from requests where timestamp > datetime('now', '-1 hour','localtime') and account = user) as hourlyAmount,(SELECT count(requestID) as dailyAmount from requests where timestamp > datetime('now', '-1 day','localtime') and account = user) as dailyAmount from accounts").all();

然后将其写入帐户部分:

var insert = db.prepare('UPDATE hourlyRequests = @hourlyAmount, dailyRequests = @dailyAmount WHERE user = @user');
const insertMany = db.transaction((users) => {
 for (const user of users) insert.run(user);
});
insertMany(userList);

对于小帐户和请求数,它可以工作,但较大的数据集需要很长时间才能计算到 Electron 应用程序完全崩溃并且通过浏览器访问非常缓慢的地步。

我已经尝试为每个帐户单独执行循环中的语句,但这无济于事并且需要很长时间来计算。

还尝试将请求完全放在单独的数据库中,但没有帮助。

指数已经设定:

[
  {
    id: 2,
    parent: 0,
    notused: 0,
    detail: 'SCAN TABLE accounts USING COVERING INDEX sqlite_autoindex_accounts_1'
  },
  {
    id: 5,
    parent: 0,
    notused: 0,
    detail: 'CORRELATED SCALAR SUBQUERY 1'
  },
  {
    id: 10,
    parent: 5,
    notused: 0,
    detail: 'SCAN TABLE requests USING COVERING INDEX requestCounter'
  },
  {
    id: 24,
    parent: 0,
    notused: 0,
    detail: 'CORRELATED SCALAR SUBQUERY 2'
  },
  {
    id: 29,
    parent: 24,
    notused: 0,
    detail: 'SCAN TABLE requests USING COVERING INDEX requestCounter'
  }
]

我该如何以不同的方式构建它?

4

0 回答 0