【问题标题】:Optimizing IndexedDB query优化 IndexedDB 查询
【发布时间】:2018-03-07 23:11:02
【问题描述】:

我正在使用Dexie.JSIndexedDB 一起工作。 目前,有一个愚蠢的查询写成:

return db.events.each((element) => {
  let d = element.cause.data;
  if (d.hasOwnProperty('deleted') && (false == d.deleted) &&
      d.hasOwnProperty('abbreviation') &&
      d.hasOwnProperty('contents') && (d.abbreviation == key)) {
    snippet = d.contents;
  }
}).then(() => {
  return snippet;
});

它工作正常,但在大型数据库上运行缓慢。我应该在应用了where 的 db.events 集合上运行每个集合吗?这会提高性能吗?

谢谢

【问题讨论】:

  • 尝试在 (cause.data) 等各种子句中使用 keyPaths - 出现关于缺少索引的异常。

标签: javascript nosql indexeddb dexie


【解决方案1】:

是的,如果假设您的“key”变量是可索引类型:字符串、数字、日期、TypedArray 或数组,您可以像这样优化查询:

首先,确保在 db.events 上添加索引“cause.data.abbreviation”:

db.version(2).stores({
  events: 'yourPrimaryKey, cause.data.abbreviation'
});

然后,像这样重写查询:

return db.events
  // Let indexedDB sort out all items matching given key:
  .where('cause.data.abbreviation').equals(key)
  // Filter the rest manually using Collection.filter():
  .filter(element => {
    let d = element.cause.data;
    return (d.hasOwnProperty('deleted') && (false == d.deleted) &&
      d.hasOwnProperty('contents'));
  })
  // Execute the query and only return the first match:
  .first();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-25
    • 2012-06-15
    • 2011-01-19
    • 1970-01-01
    相关资源
    最近更新 更多