==========
更新:
也许这不是查询会使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并不是那么慢。
答案 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;
})
})
}));
如果仍然很慢,请检查要在“套接字”对象存储中存储多少对象。还是其中一些包含大量数据?