一、开篇:你到底该用 better-sqlite3,还是传统 node‑sqlite3?
如果你在 Node.js 里用 SQLite,大概率会遇到两个库:
- 老牌的 node‑sqlite3
- 后起之秀 better-sqlite3
很多人只是"听说 better 更好",但不知道到底好在哪、为什么好、什么场景不能用 。
这篇文章就把原理、性能、API 设计、适用场景一次性讲透。
二、better-sqlite3 核心优势:为什么它全面优于 node‑sqlite3
1. 异步设计的根本问题:node‑sqlite3 用错了异步
node‑sqlite3 有一个架构级缺陷 :
它把本来就应该同步、串行执行的 SQLite 操作,强行做成异步 API。
SQLite 本身的机制就是:
- 同一时间,写操作必须串行
- 大量读操作虽然可以并发,但底层依然受锁和事务限制
node‑sqlite3 却把 CPU 密集、串行化的任务包装成异步:
- 造成大量无谓的线程切换
- 触发频繁的 mutex thrashing(互斥锁抖动)
- 资源浪费严重,性能雪崩
而 better-sqlite3 的思路非常清醒:
SQLite 该同步就同步,不要硬套异步假装高并发。
这不是退步,而是贴合数据库底层的正确设计。
2. 内存管理:从 C 语言底层 → 现代化 JS 风格
node‑sqlite3 直接暴露了很多 C 语言层面的内存管理接口 。
你必须手动关心内存、句柄、释放,很容易写错、泄漏、崩溃。
better-sqlite3 完全走 JS 风格:
- 所有对象交给 JS 垃圾回收 管理
- 不用手动释放内存、不用处理底层句柄
- 更安全、更符合 Node.js 开发者习惯
3. API 更简单,还补上了 node‑sqlite3 做不到的功能
better-sqlite3 不是"换个皮",而是真正更好用:
- 语法直观、链式调用清晰
- 事务、参数绑定、批量插入更优雅
- 提供很多 node‑sqlite3 很难实现甚至实现不了的工具方法
- 类型更稳、异常更清晰,调试成本更低
4. 性能:绝大多数场景更快,所有场景不慢
官方与社区实测都证明:
- 绝大多数查询:better-sqlite3 明显更快
- 极端场景:至少和 node‑sqlite3 一样快
- 高并发、频繁读写下,差距会被进一步放大
简单说:
你没有任何性能理由继续用 node‑sqlite3。
三、关键灵魂拷问:什么时候 better-sqlite3 也不适合?
很多人以为:
我并发高,所以要用异步 SQLite 库。
这是巨大误区。
1. 先搞懂一个真相:SQLite 本身就是串行的
不管你用什么驱动:
- 如果一条查询本身就要 1 秒
- 同时又有大量用户抢着执行这类慢查询
再多异步、再多线程,都救不了 SQLite 的串行本质。
但现实很友好:
SQLite 本身极快。
只要你做对三件事:
- 写高效 SQL
- 建正确索引
- 打开 WAL 模式
在一个 60GB 库、5 表联查 的真实场景里,依然可以轻松跑到:
每秒 2000+ 查询,每条处理 5--50KB 真实业务数据
所以:
99% 的性能问题,不是库的问题,是你没用好 SQLite。
四、这些场景,别用 better-sqlite3,也别用 SQLite
better-sqlite3 只是 SQLite 的驱动,不是魔法 。
下面这些场景,你应该直接上 PostgreSQL、MySQL 这类完整 RDBMS:
1. 高并发、大量返回超大结果
比如:
- 每次查询返回几 MB、几十 MB 数据(图片、视频、大文件)
- 同时很多人在读
SQLite 不擅长流式返回巨型数据,Node.js 内存也扛不住。
2. 超高并发写入(典型:社交平台、大量用户同时写)
SQLite 写入是串行的,WAL 也有上限。
如果你做的是:
- 高并发发帖、评论、点赞、上报日志
- 写入量巨大、冲突频繁
请直接上正经数据库。
3. 数据库接近 TB 级别
SQLite 支持到 TB 级,但:
- 维护难度飙升
- 备份、恢复、迁移麻烦
- 并发、故障恢复不如专业 RDBMS
这种规模,不该再用 SQLite。
五、总结:一套简单决策指南
你可以直接用下面这套逻辑判断:
-
你在 Node.js 用 SQLite
✔ 用 better-sqlite3
✔ 抛弃 node‑sqlite3
-
你觉得慢
→ 先查:慢查询、缺索引、没开 WAL
→ 不是库的问题
-
你真的需要超高并发写 / TB 级库 / 大量大结果返回
→ 不要纠结 SQLite 驱动
→ 直接换 PostgreSQL 等专业数据库
一句话总结:
除了必须上重型数据库的场景,better-sqlite3 就是 Node.js + SQLite 的最优解。