Better-sqlite3
跳到导航
跳到搜索
Node.js中最快的、最简单的SQLite3库。
- 完整的事务支持
- 高性能、效率和安全性
- 易于使用的同步API (比异步API更好的并发性…是的,你正确地读到了这一点)
- 支持用户自定义函数、聚合、虚拟表和扩展
- 64位整数 (直到你需要它们才可见)
- 工作线程支持 (用于大型/慢速查询)
其他库的比较
select 1 row get()
|
select 100 rows all()
|
select 100 rows iterate() 1-by-1
|
insert 1 row run()
|
insert 100 rows in a transaction | |
---|---|---|---|---|---|
better-sqlite3 | 1x | 1x | 1x | 1x | 1x |
sqlite and sqlite3 | 11.7x slower | 2.9x较慢 | 24.4x较慢 | 2.8x较慢 | 15.6x较慢 |
安装
npm install better-sqlite3
你必须使用Node.js v14.21.1或更高版本。预构建的二进制文件可用于LTS版本。
用法
const db = require('better-sqlite3')('foobar.db', options);
const row = db.prepare('SELECT * FROM users WHERE id = ?').get(userId);
console.log(row.firstName, row.lastName, row.email);
虽然不是必需的,但通常建议出于性能原因设置WAL pragma。
db.pragma('journal_mode = WAL');
ES6模块表示法:
import Database from 'better-sqlite3';
const db = new Database('foobar.db', options);
db.pragma('journal_mode = WAL');
我为什么应该使用这个而不是node-sqlite3?
node-sqlite3
使用CPU-bound或串行化任务的异步API。这不仅是错误的设计,而且浪费了大量资源。它还导致互斥竞争,对性能产生灾难性影响。node-sqlite3
暴露了低级别的(C语言)内存管理函数。better-sqlite3
以JavaScript的方式做这件事,允许垃圾回收器处理内存管理。better-sqlite3
更简单易用,为某些操作提供了非常困难的或不可能的操作的实用程序。better-sqlite3
在大多数情况下都比node-sqlite3
快得多,在所有其他情况下也是如此。
这个库何时不适用?
在大多数情况下,如果你试图使用better-sqlite3
无法合理完成的事情,那么它可能无法合理地完成SQLite3中的一般事情。例如,如果你执行的查询需要一秒钟才能完成,并且你期望有大量并发用户执行这些查询,那么无论异步性如何都无法拯救你。幸运的是,SQLite3非常非常快。通过适当的索引,我们已经能够实现每秒超过2000个查询,每个查询处理5–50千字节的实际数据。
如果你有一个性能问题,最可能的原因可能是低效的查询、不正确的索引或缺少WAL模式——而不是better-sqlite3
本身。然而,在某些情况下,better-sqlite3
可能不适合:
- 如果预期有大量的并发读取,每个返回许多兆字节的数据(即视频)
- 如果预期有大量的并发写入(即一个社交媒体网站)
- 如果数据库的大小接近千兆字节范围
对于这些情况,你应该可能使用一个完整的RDBMS,如PostgreSQL。