indexeddb是浏览器原生支持的高性能nosql前端数据库,专为结构化数据离线存储设计,依赖对象仓库、索引、事务和游标实现百万级数据稳定读写;建库须通过onupgradeneeded定义结构,主键推荐keypath,高频查询字段必须建索引;写入需批量事务分片(100–500条/批),查询应结合idbkeyrange与游标流式处理;生产环境需监听错误、处理版本阻塞并定期清理。

IndexedDB 是浏览器原生支持的高性能、大容量前端数据库,专为结构化数据离线存储而设计。它不是简单键值对,而是基于对象仓库(Object Store)和索引机制的 NoSQL 方案,支持事务、游标遍历、条件查询和百万级数据稳定读写。
建库与结构设计:一次定义,长期可用
数据库版本号是结构演进的核心开关。首次打开或版本升级时触发 onupgradeneeded,此时才能创建或修改对象仓库与索引——这一步不可跳过,也不能在普通事务中执行。
- 主键推荐显式指定
keyPath(如'id'),避免依赖自增导致后续查询不便 - 高频查询字段必须建索引,例如按分类查、按时间范围查、按状态过滤,都应提前
createIndex() - 一个对象仓库可建多个索引,但每个索引名需唯一;索引字段若可能为空,设
{ unique: false }
写入优化:批量事务 + 分片控制
单条 add() 或 put() 调用开销高,尤其面对数千以上记录时。关键不是“多开事务”,而是“少开事务”。
- 所有写操作必须包裹在
readwrite事务中,且尽量合并到同一事务内 - 每批写入建议控制在 100–500 条之间,既避免内存溢出,也防止事务超时或阻塞渲染
- 使用
requestIdleCallback或 Web Worker 拆分大批量任务,保持 UI 响应性
高效查询:索引 + 范围 + 游标组合
仅靠 get(key) 只能查主键,真正发挥 IndexedDB 性能优势靠的是索引配合 IDBKeyRange。
- 用
index.get()或index.getAll()直接走索引,比遍历快几个数量级 - 范围查询示例:
IDBKeyRange.bound('2025-01', '2025-12', true, true)查某年数据 - 海量结果不用
getAll()一次性加载,改用openCursor()流式处理,内存友好
稳定性保障:错误监听 + 版本兼容 + 清理策略
生产环境必须考虑降级与兜底,不能只依赖 success 回调。
- 监听
onblocked事件,提示用户关闭旧标签页,避免新版本卡住 - 事务失败时检查
event.target.error.name,常见如QuotaExceededError(配额满)、AbortError(手动中止) - 定期用
indexedDB.deleteDatabase()或清空 objectStore 配合版本升级,防止冗余数据膨胀
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











