首页 > 解决方案 > 如何从 indexeddb 数据库中加快自动完成的性能

问题描述

idb我有 jQuery 自动完成字段,它必须搜索从 IndexedDB 查询(使用包装器)填充的数千个项目。以下是用户开始在框中输入时调用的自动完成功能。hasKW()是一个查找关键字的函数。

async function siteAutoComplete(request, response) {
  const db = await openDB('AgencySite');
  const hasKW = createKeyWordFunction(request.term);

  const state = "NY";
  const PR = 0;
  const agency_id = 17;
  const range = IDBKeyRange.bound([state, PR, agency_id], [state, PR, agency_id || 9999999]);
  let cursor = await db.transaction('sites').store.index("statePRAgency").openCursor(range);
  let result = [];

  while (cursor) {
    if (hasKW(cursor.value.name)) result.push({
      value: cursor.value.id,
      label: cursor.value.name
    });
    cursor = await cursor.continue();
  }

  response(result);

}

我的问题是:我不确定光标是否让一切变慢。有没有办法在不使用游标的情况下获取与查询匹配的所有数据库行?构建result阵列会减慢我的速度吗?有没有更好的方法来做到这一点?目前显示自动完成列表需要 2-3 秒。

标签: javascriptasync-awaitjquery-ui-autocompleteindexeddb

解决方案


我希望这对其他人有用。我删除了光标,只是将整个数据库下载到一个 javascript 数组中,然后使用.filter. 加速是戏剧性的。使用上述方法耗时 2300 毫秒,使用此方法耗时约 21 毫秒:

  let result = await db.transaction('sites').store.index("statePRAgency").getAll();
  response(result.filter(hasKW));

推荐阅读