dexie.js:第一次嵌套查询非常慢

时间:2019-08-05 04:26:48

标签: indexeddb dexie

==========

更新:

也许这不是查询会使indexeddb变慢,而是保存操作阻止了db。我从webSocket获取数据,因此每秒需要保存将近900个项目,并且将其一一保存。现在我将其保存在内存中,使用  “ bulkPut”功能可以保存所有内容,几乎完成了13秒。

对我的不完整描述表示歉意,并感谢您的所有帮助!

==========

我先尝试indexeddb,但是两个嵌套事务使内部事务非常慢。然后,我使用Dexie.js,但情况相同。

我指的是文档,他们说允许嵌套查询,但是所有示例都是单个查询。

在我的情况下,有两个存储,一个存储名为“ ps”,另一个存储名为“ socket”。 “ ps” objectStore有4个项目,但是套接字objectStore可能有10,000个项目。

db.ps.toArray().then(lines => {
  lines.map(l => {
    console.log(l);
    console.time(l.name + '_' + 'sockets');
    db.socket.where('ps').equals(l.name).toArray().then(sockets => {
      console.timeEnd(l.name + '_' + 'sockets');

    })
  })
})

这是时间记录结果:

67个套接字:131583.873046875ms

42个套接字:131614.40478515625ms

33个套接字:131631.00805664062ms

22个套接字:131634.97705078125ms

那么问题出在哪里呢?我认为indexeddb并不是那么慢。

1 个答案:

答案 0 :(得分:0)

将整个函数封装在一个事务块中,否则每个操作都将在它自己的事务中启动,这可能显示查询。

let promise=db.transaction('r', db.ps, db.socket, ()=>
  db.ps.toArray().then(lines => {
    return lines.map(l => {
      console.time(l.name + '_' + 'sockets');
      return db.socket.where('ps').equals(l.name).toArray().then(sockets => {
        console.timeEnd(l.name + '_' + 'sockets');
        return sockets;
      })
    })
  }));

如果仍然很慢,请检查要在“套接字”对象存储中存储多少对象。还是其中一些包含大量数据?

相关问题