用途:处理 PostgreSQL 中 JSON 列的查询与索引,避免因缺少合适索引或选错操作符类导致 JSONB 查询变慢。
主要能力:一是类型选择,说明 json 按原文存储、每次读取重新解析且无法用于包含查询的 GIN 索引,而 jsonb 在插入时一次性解析为二进制形式,支持 GIN、B-tree、hash 与下标更新,因此除需要无损保留键顺序、空白与重复键外应使用 jsonb。二是取值操作符,-> 与 #> 返回 jsonb,#>> 与 ->> 返回 text;需要字符串值时用 ->>,不要手动把 -> 强制转为 text,否则会带 JSON 引号。三是筛选操作符,@> 表示包含,?、?|、?& 表示键存在性。四是索引选择,GIN 索引中默认 jsonb_ops 支持 @>、?、?|、?&、@?、@@;jsonb_path_ops 体积约小 3 至 5 倍、纯 @> 包含查询更快,但不支持键存在性操作符,使用这些操作符会退化为顺序扫描。若频繁使用 WHERE doc->>'key' = '...',应建立 B-tree 表达式索引,如 CREATE INDEX ON t ((doc->>'key')),因为 ->> 不能直接走 GIN。
更新方式:可用 jsonb_set、jsonb_insert,PostgreSQL 14 及以上支持下标更新,例如 UPDATE t SET doc['status'] = '"paid"' WHERE id = 42。应在 SQL 内更新单个键,避免在应用层序列化整份文档再写回,以免并发写丢失。
进阶查询:PostgreSQL 12 起支持 jsonpath(@?、@@、jsonb_path_query、jsonb_path_match),适合数组内过滤与递归下降;PostgreSQL 17 起可用 JSON_TABLE 将 JSON 数组投影为关系行,旧版本可用 jsonb_to_recordset 或 LATERAL jsonb_array_elements 替代。
限制与边界:本技能不覆盖跨类型的索引策略、数组/tsvector/pg_trgm 的 GIN 索引、JSON 校验与 check 约束、以及 GIN 选择之外的性能调优分析,这些属于其他主题。资料未提供收费、平台与版本之外的更多内容。