indexeddb 是浏览器内置的独立 nosql 数据库 api,非 bom 组成部分,但通过 window.indexeddb 暴露;支持异步事务、索引查询、大容量(250mb 起)及 blob 等原生类型存储,适用于离线应用与结构化数据管理。

IndexedDB 本身不属于 BOM(Browser Object Model)的一部分,它是独立的 Web API,由 window.indexedDB 提供入口,但逻辑上是浏览器内置的持久化数据库系统,不是 BOM 的组成部分。不过它确实挂载在 window 全局对象下,所以你可以在 window 作用域中直接调用 indexedDB.open() 等方法。
要在 window 作用域下高效完成大容量结构化数据的异步存储,关键不是“能不能用”,而是怎么组织写入、避免阻塞、保证稳定性与性能。以下是实际可行的核心做法:
分批事务写入,防止主线程卡死
一次性提交数万条记录会触发内存压力或被浏览器中断,必须拆解为小批次,在单个 readwrite 事务中批量操作:
- 每批控制在 100–500 条数据,具体视单条体积而定(如含 Blob 则更少)
- 使用
objectStore.put()或add()批量添加,不要逐条开启事务 - 每批写完立即结束事务,再发起下一批,可用
async/await+ 递归或setTimeout控制节奏 - 监听
onsuccess/onerror,失败时跳过当前批次或重试(需防无限循环)
主键与索引设计影响读写效率
结构不合理会导致查询慢、写入拖沓:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 主键(
keyPath)优先选业务唯一字段(如id),避免用autoIncrement配合高并发写入 - 对常用查询字段(如
timestamp、category、status)在onupgradeneeded中建索引 - 复合索引按查询顺序声明,例如
store.createIndex('by_time_type', ['timestamp', 'type']) - 避免为更新频繁的字段建过多索引,写入开销会上升
游标流式读取,不加载全量到内存
遍历海量数据时,绝不能 getAll():
- 用
store.openCursor()或index.openCursor()启动游标 - 在
onsuccess回调中处理event.target.result,调用cursor.continue()推进 - 可配合
cursor.advance(n)实现跳页,或cursor.seek(key)定位起点 - 注意:游标和事务生命周期绑定,所有操作必须在事务关闭前完成
Blob 和 ArrayBuffer 直存,不转 base64
图片、音频、PDF 等二进制数据应原样入库:
- 写入时直接
store.put(blob, key),IndexedDB 原生支持 Blob 类型 - 读取后可用
URL.createObjectURL(blob)渲染,或用FileReader转文本/数组 - 不要先
.toString('base64'),那会放大体积约 33%,且增加序列化负担
这些做法不需要额外库,纯原生 API 即可落地。只要控制好事务粒度、索引策略和数据形态,就能在 window.indexedDB 下稳定支撑数十万条记录、百 MB 级结构化+二进制混合数据。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










