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