news 2026/8/17 22:47:42

pgrust JSONB 使用指南:JSON 重型工作负载的优化之道

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
pgrust JSONB 使用指南:JSON 重型工作负载的优化之道

pgrust JSONB 使用指南:JSON 重型工作负载的优化之道

【免费下载链接】pgrustPostgres rewritten in Rust, now faster than Postgres and Clickhouse项目地址: https://gitcode.com/GitHub_Trending/pg/pgrust

pgrust 是一个用 Rust 从零重写 PostgreSQL 的开源数据库项目,目标是保持与 Postgres 18.3 的完全兼容(已通过超过 4.6 万条回归测试查询),同时把查询性能提升一个量级。对于处理 JSON 数据的开发者来说,pgrust JSONB 支持是最大的亮点之一:官方路线图明确把「更好的 JSON 重型工作负载支持」列为重点方向。本文是一份面向新手的 pgrust JSONB 使用指南,涵盖基础用法、GIN 索引优化技巧,以及 pgrust 在 JSON 重型场景下更快的原因。

pgrust 是什么:用 Rust 重写 Postgres 意味着什么

传统数据库性能优化往往受限于 C 语言的内存安全负担和进程模型。pgrust 的核心思路是:

  • 用 Rust 的安全内存模型替换 C 的手动内存管理,从根本上减少缓冲区溢出类问题;
  • 从进程模型转向多线程模型(thread per connection),大幅降低连接开销;
  • 保持 Postgres 的磁盘格式与 SQL 语义完全兼容,原有数据目录可以直接启动。

根据项目介绍,新一代 pgrust 在事务型负载上比 Postgres 快约 50%,在分析型负载上快约 300 倍(ClickBench 基准测试中仅比 ClickHouse 慢 2 倍,且仍在优化)。JSONB 这类读写频繁、路径解析开销大的数据类型,正是这种重写收益最明显的地方。

快速上手:一分钟启动 pgrust 体验 JSONB

最简单的体验方式是使用官方 Docker 镜像,一条命令即可启动:

docker run -d --name pgrust -e POSTGRES_PASSWORD=secret malisper/pgrust:v0.1

启动后即可用 psql 连接,连接方式与原生 PostgreSQL 完全一致。也可以从源码构建:项目使用 Cargo 工作区组织,构建命令在仓库根目录的 README 中有完整说明,构建产物是target/release/postgres,可直接执行--initdb初始化数据目录。

JSONB 基础用法:从建表到查询

JSONB 是 PostgreSQL 的二进制 JSON 格式,相比json文本类型,它去除了冗余空白、按键排序、不保留重复键,并支持 GIN 索引,是 JSON 重型工作负载的正确选择。在 pgrust 中使用 JSONB 与原生 Postgres 完全一致:

-- 建表 CREATE TABLE events ( id bigserial PRIMARY KEY, payload jsonb NOT NULL ); -- 插入 INSERT INTO events (payload) VALUES ('{"user": "alice", "action": "click", "tags": ["a", "b"]}'); -- 查询 SELECT payload->>'user' AS user, payload->'tags'->>0 AS first_tag FROM events; -- 使用 jsonpath 路径查询 SELECT payload @? '$.tags[*] ? (@ == "a")' FROM events;

pgrust 的 JSONB 函数覆盖非常完整,从->->>#>#>>取值操作符,到jsonb_array_elementsjsonb_object_keysjsonb_path_query等集合函数,均已在 Rust 中重写实现。以集合函数为例,实现在 jsonb_srf.rs 中,包括jsonb_array_elements(OID 3219)、jsonb_array_elements_text(OID 3465)、jsonb_object_keys(OID 3931)以及jsonb_path_query(OID 4006)等常用函数。

JSONB 优化技巧:GIN 索引的正确打开方式

JSON 重型工作负载的性能瓶颈通常不在存储,而在过滤与检索。为 JSONB 建立 GIN 索引是核心优化手段,pgrust 完整支持 Postgres 的两种 GIN 操作符类:

jsonb_ops(默认):适合键存在性、包含关系等通用查询,如@>,?,?|,?&

CREATE INDEX idx_events_payload ON events USING gin (payload); SELECT * FROM events WHERE payload @> '{"user": "alice"}';

jsonb_path_ops:只支持@>包含查询,但索引更小(键被哈希存储)、查询更快,适合只做包含判断的场景:

CREATE INDEX idx_events_payload_path ON events USING gin (payload jsonb_path_ops);

两者的取舍很直接:如果你只依赖@>过滤,用jsonb_path_ops更省空间更快;如果需要?(键存在)或?|/?&(任一/全部键存在)查询,则必须用默认的jsonb_ops

这些 GIN 操作符类相关的策略常量与提取逻辑,在 jsonb_gin.rs 中有清晰定义:比如JsonbContainsStrategyNumber = 7JsonbExistsStrategyNumber = 9等策略号,以及jsonb_path_ops将键哈希后存储的标记(JGINFLAG_HASHED,超过 125 字节的文本键会自动哈希)。理解这些内部机制,有助于你判断索引行为是否符合预期。

pgrust JSONB 更快的原因:零拷贝与 owned-tree 设计

这是 pgrust 在 JSON 重型工作负载上表现优异的技术内核,值得多说两句。

原生 Postgres 的 JSONB 解析依赖 C 的指针算术与手动内存管理。pgrust 则把 JSONB 的磁盘格式(JsonbJsonbContainerJEntry头字)与内存工作类型(JsonbValueJsonbPairJsonbIterator)分层建模,相关定义在 jsonb.rs 与 jsonb_util.rs 中。

其中最有价值的设计是零拷贝读取:解析 JSONB 文档时,字符串、数字等叶子节点不再复制一份内存,而是直接以借用切片(&'mcx [u8])指向原始文档缓冲区,只有构造新文档时才在内存上下文中分配。这避免了大量无谓的内存拷贝,正是高频 JSON 读写场景提速的关键。同时,磁盘上的弹性数组成员被建模为 Rust 的所有权 Vec,类型安全由编译器保证,彻底告别 C 版本中越界读写带来的隐患。

JSONB 聚合与高级函数:处理真实业务数据

除了基础查询,JSON 重型业务还经常需要聚合与展开。pgrust 实现了完整的 JSONB 聚合函数族,包括jsonb_aggjsonb_object_agg等,实现在 agg_fmgr.rs;大批 JSONB 操作符与内置函数注册在 fmgr_builtins.rs。

-- 按 user 聚合行为标签 SELECT payload->>'user' AS user, jsonb_agg(payload->'action') AS actions FROM events GROUP BY 1; -- 展开数组为行 SELECT id, elem FROM events, jsonb_array_elements(payload->'tags') AS elem;

如果对实现细节感兴趣,项目还提供了 tests.rs 作为阅读入口,里面覆盖了大量 JSONB 边界场景的测试用例。

写在最后:pgrust JSONB 的使用建议

给正在规划 JSON 重型工作负载的开发者几点建议:

  1. 数据建模:能用 JSONB 就用 JSONB,不要用json文本类型,索引与查询效率差距明显;
  2. 索引先行:过滤频繁的键尽早建立 GIN 索引,纯包含查询优先选择jsonb_path_ops
  3. 避免超大文档:单个 JSONB 文档过大时,解析与索引成本会非线性上升,考虑拆表或分片;
  4. 关注兼容性:pgrust 目前尚未达到生产就绪状态,生产环境建议先在测试环境充分验证,但其磁盘兼容特性让迁移成本极低——现有 Postgres 18.3 数据目录可以直接被 pgrust 启动。

pgrust 正在让「Postgres 兼容 + 数据库内核快速演进」成为现实,而 JSONB 正是观察这场重写红利的最佳窗口。无论你是想优化现有 JSON 业务,还是对 Rust 重写数据库感兴趣,都值得立刻上手体验。

【免费下载链接】pgrustPostgres rewritten in Rust, now faster than Postgres and Clickhouse项目地址: https://gitcode.com/GitHub_Trending/pg/pgrust

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/17 22:45:13

SQL Server跨服务器查询实战:链接服务器配置、性能优化与安全指南

1. 项目概述:为什么我们需要跨服务器查询?在数据库运维和开发工作中,我经常遇到一个场景:数据分散在不同的服务器上。比如,公司的财务数据在A服务器,而销售数据在B服务器。当老板需要一份结合了销售额和成本…

作者头像 李华
网站建设 2026/8/17 22:43:09

Qwen3.8-27B上架Ollama:本地部署工具调用大模型的完整实践指南

1. 先搞清楚 Qwen3.8-27B 上架 Ollama 到底解决了什么问题 如果你在本地跑过大语言模型,肯定遇到过两个最头疼的问题:一是模型太大,下载和管理麻烦;二是模型功能单一,让它写代码可以,但想让它调用个计算器、…

作者头像 李华