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' 对象存储中存储的对象有多大。还是其中一些包含大量数据?
==========
更新:
也许这不是查询使索引数据库变慢,而是保存操作阻塞了数据库。我是从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' 对象存储中存储的对象有多大。还是其中一些包含大量数据?