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

dexie.js: nested query very slow at first time

==========

更新:

也许这不是查询使索引数据库变慢,而是保存操作阻塞了数据库。我是从webSocket中获取数据的,所以每秒差不多需要保存900条,我一个一个保存。现在我把它保存在内存中,使用 "bulkPut" 功能全部保存,差不多 13 秒就完成了。

对于我的不完整描述深表歉意,感谢您的帮助!

==========

我首先尝试了 indexeddb,但是两个嵌套事务使内部事务非常慢。然后我使用 Dexie.js,但事情是一样的。

我参考了文档,他们说允许嵌套查询,但是所有的例子都是单查询。

以我为例,有两家商店,一家名为'ps',另一家名为'socket'。 'ps' objectStore 有 4 个项目,但 socket 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_sockets: 131583.873046875ms

42_sockets: 131614.40478515625ms

33_sockets: 131631.00805664062ms

22_sockets: 131634.97705078125ms

那么问题出在哪里呢?我觉得indexeddb没那么慢。

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

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;
      })
    })
  }));

如果仍然很慢,请检查您在 'socket' 对象存储中存储的对象有多大。还是其中一些包含大量数据?