IndexedDB中索引是条件查询、范围查询和排序的必备前提,必须在onupgradeneeded中通过createIndex()创建,且需指定唯一索引名、字段路径及选项;索引提升读取效率但增加写入开销,应按高频查询字段谨慎创建。

索引必须在 onupgradeneeded 中创建
索引不能事后添加,只能在数据库版本升级时定义。也就是说:只要你想按某个字段查(比如 email、status、createdAt),就必须在 onupgradeneeded 里显式调用 createIndex()。
- 版本号不变 → 不触发
onupgradeneeded→ 索引不会被创建 - 首次打开数据库或主动增大 version 值(如从 1 改为 2)→ 触发该事件 → 可安全创建/更新索引
- 索引名要唯一,且不能和对象仓库名冲突;建议用语义化名称,如
"emailIndex"、"timeRangeIndex"
创建索引的关键参数
调用 store.createIndex(indexName, keyPath, options) 时,三个参数各有作用:
- indexName:索引的标识名,后续查询时要用它获取索引对象
-
keyPath:对应数据对象中的字段路径,支持嵌套(如
"profile.city"),但需确保该字段存在且类型稳定 -
options:常用两个属性:
{ unique: true }(值必须唯一,重复会报错);{ multiEntry: true }(当字段是数组时,为每个元素建一条索引项)
用索引做高效条件查询
有了索引,就能绕过全量扫描,直接定位匹配项:
-
单值精确查:用
index.get(value),返回第一个匹配项(适合用户名、邮箱等唯一或准唯一字段) -
多值查(非唯一):用
index.getAll(value)或index.openCursor(IDBKeyRange.only(value)),拿到所有同值记录 -
范围查询:配合
IDBKeyRange.lowerBound()、upperBound()或bound(),例如查 “2025-01-01 ≤ createdAt ≤ 2025-12-31” -
排序查询:游标默认按索引键升序遍历;加
{ direction: 'desc' }参数可倒序,无需额外 sort()
索引不是越多越好,要权衡写入与空间
每建一个索引,写入时都要同步更新索引结构,会略微拖慢 add()/put() 性能;同时索引也占存储空间。所以:
立即学习“Java免费学习笔记(深入)”;
- 只对真正高频查询的字段建索引(比如列表页常按 category 筛选,就建
category索引) - 避免对变动频繁、又极少用于查询的字段建索引(如
lastSeenAt) - 复合索引暂不原生支持,若需多字段联合查询,可考虑拼接字段存为新属性再建索引(如
status_priority = "active_1")


















