主要观点:Postgres 17 即将发布,其中一项重要改进是允许 Btree 索引更高效地查找一组值,通过Postgres 17 对 nbtree 的ScalaryArrayOp
执行的增强,多值查找不再需要多次重复遍历。为测试该优化在真实应用中的效果,对支持Crunchy Bridge的 API 服务进行了测试,在 Go 语言编写的 API 中,通过两阶段加载和渲染技术减少 N+1 问题,测试了 Postgres 16 和 17 下的性能,发现从 Postgres 16 到 17 吞吐量提高约 30%,平均请求时间降低 20%。
关键信息:
- Postgres 17 即将发布,有众多功能、改进和优化。
- Btree 索引是 Postgres 最常用和优化最好的索引,用于表的主键或二级索引查找。
- 之前多值查找需要多次重复遍历,现在
ScalaryArrayOp
改进可一起检索同一叶页上的多个值。 - 测试的 API 是用 Go 编写的生产级程序,选择
GET /teams/:id/members
端点进行测试。 - 加载团队成员页面及相关数据的查询模式,涉及多个数据库模型和
id = any(...)
的查找。 - 使用go-wrk进行基准测试,测试了 Postgres 16 和 17 下的性能。
- 测试结果显示从 Postgres 16 到 17 吞吐量提高约 30%,平均请求时间降低 20%。
重要细节:
- 团队成员包含自身的 ID 和角色,还嵌入了关联用户的账户详细信息。
- 两阶段加载和渲染技术可批量加载所有渲染 API 资源所需的数据库记录。
- 测试时生成了一个有 100 个团队成员/账户及相关记录的团队。
- 基准测试持续 60 秒以补偿冷启动和缓存,考虑了非数据库工作的额外开销。
- 测试结果以图表形式展示,直观地显示了性能提升。
- 作者认为在使用类似 Rails 框架进行大量急切加载的应用中也会有类似的性能提升。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。