工作原理
Drizzle 最初被设计为一个位于 SQL 之上的薄层,引入最小的运行时开销,并通过引入预准备语句和关系查询,我们已经打破了它。现在它既快速又具有出色的 DX,并且没有关系查询的 n+1 问题。
但是它有多快?是 Drizzle 快还是 SQL 快?测量什么?
什么是有意义的基准测试? 我们花了很多时间使用 mitata 进行合成基准测试,在单个运行时中测试一切,然后在单独的容器化环境中测试,以确保没有 GC 交叉影响。社区成员制作了自己的基准测试,帮助我们分配关系查询性能和行读取瓶颈,并使它们变得非常快速和高效。
我们测试了所有竞争对手的不同 SQL 方言,虽然我们在某些情况下比 Prisma 使用 SQLite 快 100 倍以上,但我们只希望分享对企业和开发者有意义的基准测试。
从商业角度来看,请求往返是最重要的指标,当涉及到服务器性能时。虽然你可以通过像 Cloudflare Argo 这样的服务来影响网络延迟,但在服务器端,通常归结为数据库查询。
我们使用了一个包含大约 370k 条记录的 PostgreSQL 数据库测试用例,并在 1GB 以太网上生成了类似生产的电子商务流量基准测试,以消除任何差异。在 Lenovo M720q 上,Drizzle 可以处理 4.6k reqs/s,同时保持约 100ms 的 p95 延迟。
我们在两台不同的机器上运行了基准测试,以确保观察者不会影响结果。对于数据库,我们使用了一个包含 42MB 电子商务数据的 PostgreSQL 实例(大约 370k 条记录)。 K6基准测试实例运行在 MacBook Ai r上,通过 1GB 以太网向配备 Intel Core i3-9100T 和 32GB RAM 的 Lenovo M720q 发送了 1M 个预制请求。
运行自己的测试 - 遵循以下说明!
准备测试机
- 使用
pnpm start:docker
命令启动一个包含 PostgreSQL 的 Docker 容器。你可以在./src/docker.ts
文件中配置所需的数据库端口:
- 在 .env 文件中使用分配的数据库端口更新
DATABASE_URL
。
- 使用
pnpm start:seed
命令为你的数据库填充测试数据,你可以在./src/seed.ts
文件中更改数据库的大小。
- 确保你已经安装了 Node.js 版本 18 或更高版本。你可以使用
nvm use 18
命令。 - 启动 Drizzle/Prisma 服务器:
准备测试机器
- 使用
pnpm start:generate
生成一个HTTP请求列表。它会将需要运行在测试服务器上的HTTP请求列表输出到./data/requests.json
文件中。 - 安装 k6 负载测试器。
- 在
./k6.js
文件中配置测试服务器的URL。
- 使用
k6 run bench.js
运行测试 🚀