javascript - 如何从 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 秒。
解决方案
我希望这对其他人有用。我删除了光标,只是将整个数据库下载到一个 javascript 数组中,然后使用.filter
. 加速是戏剧性的。使用上述方法耗时 2300 毫秒,使用此方法耗时约 21 毫秒:
let result = await db.transaction('sites').store.index("statePRAgency").getAll();
response(result.filter(hasKW));
推荐阅读
- javascript - 如何使用 axios 和 promise 从 url 数组中获取数据
- excel - 无法使用 VBA 在 Excel 中插入图片
- c# - 快速排序程序排序但从不停止
- php - 我需要为 OAuth2 服务器到服务器的通信存储哪些数据?
- python - Pandas Advanced:如何为5天内至少购买两次的客户获取结果?
- angular - 尝试使用 MSAL 执行 Azure DevOps API 时出现“Microsoft Internet Explorer 的增强安全配置..”错误
- c++ - 指针网格保持空间结构随对象数量的变化 C++
- javascript - 从登录屏幕重定向问题
- python-3.x - 将图像插入文本框时的 Tkinter image_create 性能
- owl - OWL:is-part-of 关系可以通过普遍限制来定义吗?