如何解决Dexie db的加班时间变慢了
我正在使用带有Angular 8和电子的Dexie DB版本2.0.4。我意识到我在数据库中输入的数据越多,对其进行的查询越多,数据库调用就变得越慢。
我是Dexie菜鸟,不确定在发出某些请求后是否有办法关闭连接,或者内存中是否有卡住的东西。
任何人都知道如何调试或确认问题可能是什么?
以下是我向数据库提出的请求之一的示例:
await this.indexdb.TableName.filter(SomeProperty => SomeProperty == Property).toArray();
await this.indexdb.TableName.put({'SomePropertyName':'SomePropertyValue'})
非常感谢
解决方法
filter方法不使用任何索引,而是使用游标浏览表中的所有行以测试您的条件。使用Zone.js(它是Angular的一部分)时,这可能会变慢,尤其是变慢,因为它将拦截所有IndexedDB事件,并针对要针对您的过滤条件进行测试的每一行对整个应用进行更改检测。
如果您可以为“ SomeProperty”建立索引并使用dexie运算符检查它而不是使用过滤器,则会获得更好的性能,请参见下面的示例片段:
// Indexing a property:
this.indexdb = new Dexie('yourDbName');
this.indexdb.version(x).stores({
tableName: "id,SomeProperty" // index SomeProperty
});
// Query utilizing the index instead of using filter():
await this.indexdb.TableName.where('SomeProperty').equals(Property).toArray();
利用索引是indexedDB的整体思想,尤其是随着数据的增长。除equals()外,还有其他运算符。参见Dexie's WhereClause docs
如果查询过于复杂而无法与dexie运算符配合使用,则使用this.indexdb.TableName.toArray().then(result => result.filter(yourCriteriaFn))
而不是this.indexdb.TableName.filter(yourCriteriaFn).toArray()
可能会更好,因为这样Dexie将能够跳过每一行的游标迭代而是使用getAll()方法生成一个事件,而不是每行一个。
另请参阅issue in dexie,有关在Angular和IndexedDB中可能特有的缓慢性
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。