【问题标题】:Dexie db gets slower overtimeDexie db 加班速度变慢
【发布时间】:2021-01-10 23:51:53
【问题描述】:

我正在使用带有 Angular 8 和电子的 Dexie DB 版本 2.0.4。我意识到我在数据库中输入的数据越多,对它的查询越多,我的数据库调用就越慢。

我是 Dexie 菜鸟,不确定在我提出某些请求后是否有办法关闭连接,或者是否有什么东西卡在内存中。

任何人都知道如何调试或确认问题是什么?

这是我向数据库提出的请求之一的示例:

await this.indexdb.TableName.filter(SomeProperty => SomeProperty == Property).toArray();
await this.indexdb.TableName.put({'SomePropertyName':'SomePropertyValue'})

非常感谢

【问题讨论】:

    标签: angular electron chromium indexeddb dexie


    【解决方案1】:

    过滤器方法不使用任何索引,而是使用游标遍历表中的所有行来测试您的条件。使用 Zone.js(它是 Angular 的一部分)时,这可能会变得很慢,尤其是缓慢,因为它会拦截所有 IndexedDB 事件,并针对您的过滤条件测试的每一行对您的整个应用程序进行更改检测。

    如果您可以索引“SomeProperty”并使用 dexie 运算符而不是使用过滤器来检查它,您将获得更好的性能,请参见下面的示例 sn-p:

    // 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 中可能出现的缓慢

    【讨论】:

    • 按照这种方法,从数据库中读取的数据从~1s减少到~80-100ms
    猜你喜欢
    • 2018-12-30
    • 2018-12-08
    • 2014-02-17
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 2010-12-24
    相关资源
    最近更新 更多