工作原理
Drizzle 最初被设计为 SQL 之上的薄层,旨在引入最小的运行时开销。通过引入预处理语句和关系查询,我们取得了巨大的成功。现在,它既快速,又拥有出色的开发体验,并且关系查询没有 N+1 问题。
但它到底有多快?是 Drizzle 快还是 SQL 快?该测量什么?
什么是有意义的基准测试?我们花了很多时间使用 mitata 进行合成基准测试,在同一个运行时中以及在独立的容器化环境中进行测试,以避免垃圾回收的交叉影响。社区也进行了他们自己的基准测试,并帮助我们定位关系查询性能和行读取的瓶颈,使它们变得非常快速和高效。
我们测试了所有竞争对手的不同 SQL 方言,虽然我们速度极快,在某些情况下比 Prisma 使用 SQLite 快 100 多倍,但我们只想分享对企业和开发者有意义的基准测试。
从业务角度来看,请求往返时间是衡量服务器端性能最重要的指标。虽然您可以通过 Cloudflare Argo 等服务影响网络延迟,但在服务器端,性能通常归结为数据库查询。
我们构建了一个测试用例,在 PostgreSQL 数据库中包含约 37 万条记录,并在 1GB 以太网上生成了类似生产环境的电子商务流量基准测试,以消除任何差异。在联想 M720q 上,Drizzle 可以处理 4.6k 请求/秒,同时保持约 100ms 的 p95 延迟。
我们在两台独立的机器上运行了基准测试,以确保观察者不会影响结果。对于数据库,我们使用了一个 PostgreSQL 实例,其中包含 42MB 的电子商务数据(约 37 万条记录)。
K6 基准测试实例运行在 MacBook Air 上,通过 1GB 以太网向配备 Intel Core i3-9100T 处理器和 32GB 内存的联想 M720q 发送 100 万个预处理请求。
要运行您自己的测试 - 请遵循以下说明!
准备测试机
- 使用
pnpm start:docker
命令启动一个包含 PostgreSQL 的 Docker 容器。您可以在./src/docker.ts
文件中配置所需的数据库端口。
...
}
const desiredPostgresPort = 5432; // change here
main();
- 在 .env 文件中,用分配的数据库端口更新
DATABASE_URL
。
DATABASE_URL="postgres://postgres:postgres@localhost:5432/postgres"
- 使用
pnpm start:seed
命令为数据库填充测试数据,您可以在./src/seed.ts
文件中更改数据库大小。
...
}
main("micro"); // nano | micro
- 确保您已安装 Node 18 或更高版本。您可以使用
nvm use 18
命令。 - 启动 Drizzle/Prisma 服务器
## Drizzle
pnpm start:drizzle
## Prisma
pnpm prepare:prisma
pnpm start:prisma
准备测试机器
- 使用
pnpm start:generate
生成 HTTP 请求列表。它将输出一个要在被测试服务器上运行的 HTTP 请求列表 |./data/requests.json
- 安装 k6 负载测试工具
- 在
./k6.js
文件中配置被测试服务器的 URL。
// const host = `http://192.168.31.144:3000`; // drizzle
const host = `http://192.168.31.144:3001`; // prisma
- 使用
k6 run bench.js
运行测试 🚀