IndexedDB索引更新完全自动且强一致:数据写入(add/put/delete/clear)涉及索引字段时,索引在同事务内原子性同步更新;读操作不触发更新;多索引会增加写入开销;版本升级时新建索引自动扫描填充。

IndexedDB 中的索引更新不是手动触发的,而是完全自动、同步发生的——只要数据写入(add、put、delete)涉及索引字段,对应索引就会立即更新,无需额外操作。
索引更新发生在数据变更的同一事务内
IndexedDB 的索引是“强一致性”的辅助结构。当你在事务中执行 objectStore.put() 或 delete() 时,如果该对象的属性被某个索引所覆盖(比如你为 email 字段建了索引),那么数据库会在写入主数据的同时,原子性地更新所有相关索引条目。
- 事务成功提交 → 主数据 + 所有匹配索引全部更新完成
- 事务中途失败 → 主数据回滚,索引也保持原状,不会残留脏数据
- 哪怕只改了一个字段,只要它属于某个索引键路径(如
index('status')),索引就参与更新
哪些操作会触发索引更新
只要修改的数据对象包含索引所依赖的字段,以下操作均会连带更新索引:
-
put():插入新记录或更新已有记录(主键存在时) -
add():仅插入,主键冲突会报错,但依然触发索引写入 -
delete():按主键删除时,对应索引项自动移除 -
clear():清空整个 objectStore,所有索引条目同步清空
注意:get()、getAll()、游标遍历等读操作完全不触发索引更新。
索引更新对性能的影响
每个索引都会增加写操作开销。写一条记录时,数据库不仅要写主数据,还要为每个相关索引构建/维护 B+ 树节点。索引越多,写入越慢。
- 单索引写入:比无索引慢约 10%–20%
- 三个复合索引:写入耗时可能翻倍,尤其在高并发事务中更明显
- 建议只对高频查询字段建索引,避免为低频字段或仅用于展示的字段冗余建索引
版本升级时的索引重建逻辑
当通过 open(..., newVersion) 升级数据库时,若在 onupgradeneeded 中调用 createIndex(),IndexedDB 会自动扫描已有数据并填充新索引——这个过程是阻塞式同步构建,可能耗时较长(例如 10 万条记录建索引需数百毫秒)。
- 已存在的索引若未被删除,其数据保持不变
- 若调用
deleteIndex()再重建,旧索引被丢弃,新索引从空开始构建 - 升级期间其他连接会被暂停,直到
onupgradeneeded完成

















