如何在 PostgreSQL 中高效地索引 JSON 数组以加快元素检索速度?
Jan 21, 2025 am 04:21 AM高效索引PostgreSQL中的JSON数组以加快元素检索
在PostgreSQL表中快速识别和检索JSON数组内的元素可能具有挑战性。为了获得最佳性能,务必了解适合您特定数据和查询要求的索引技术。
在PostgreSQL 9.4 中使用JSONB
PostgreSQL 9.4引入了二进制JSON数据类型jsonb,这极大地增强了索引可能性。利用jsonb可以直接在JSON数组上创建GIN索引。
CREATE TABLE tracks (id serial, artists jsonb); CREATE INDEX tracks_artists_gin_idx ON tracks USING gin (artists);
登录后复制
这使得可以使用GIN索引的查询成为可能,例如:
SELECT * FROM tracks WHERE artists @> '["The Dirty Heads"]';
登录后复制
其中@>
表示jsonb的“包含”运算符。
或者,您可以使用jsonb_path_ops GIN运算符类(非默认,通常更小且更快):
CREATE INDEX tracks_artists_gin_idx ON tracks USING gin (artists jsonb_path_ops);
登录后复制
针对唯一名称值进行优化
如果您的artists
列只包含唯一名称值的数组,则更有效的方法是将值存储为JSON文本基元,而不是对象。这消除了冗余键的需要。
CREATE TABLE tracks (id serial, artistnames jsonb); INSERT INTO tracks VALUES (2, '["The Dirty Heads", "Louis Richards"]'); CREATE INDEX tracks_artistnames_gin_idx ON tracks USING gin (artistnames);
登录后复制
查询示例:
SELECT * FROM tracks WHERE artistnames ? 'The Dirty Heads'; SELECT * FROM tracks WHERE artistnames @> '"The Dirty Heads"'::jsonb;
登录后复制
在PostgreSQL 9.3 中处理json
对于9.4之前的PostgreSQL版本,可以使用不变函数和GIN索引。
创建函数:
CREATE OR REPLACE FUNCTION json2arr(_j json, _key text) RETURNS text[] LANGUAGE sql IMMUTABLE AS 'SELECT ARRAY(SELECT elem->>_key FROM json_array_elements(_j) elem)';
登录后复制
然后创建函数索引:
CREATE INDEX tracks_artists_gin_idx ON tracks USING gin (json2arr(artists, 'name'));
登录后复制
使用与索引表达式匹配的查询:
SELECT * FROM tracks WHERE '{"The Dirty Heads"}'::text[]
登录后复制
务必确保索引中使用的函数是不变的,以启用函数索引。关键运算符...
文章对原文进行了改写,使用了更简洁的语言,并对部分语句进行了调整,但保留了原文的核心内容和图片位置。
以上是如何在 PostgreSQL 中高效地索引 JSON 数组以加快元素检索速度?的详细内容。更多信息请关注PHP中文网其他相关文章!
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门文章
击败分裂小说需要多长时间?
3 周前
By DDD
仓库:如何复兴队友
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 周前
By 尊渡假赌尊渡假赌尊渡假赌
公众号网页更新缓存难题:如何避免版本更新后旧缓存影响用户体验?
3 周前
By 王林

热门文章
击败分裂小说需要多长时间?
3 周前
By DDD
仓库:如何复兴队友
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 周前
By 尊渡假赌尊渡假赌尊渡假赌
公众号网页更新缓存难题:如何避免版本更新后旧缓存影响用户体验?
3 周前
By 王林

热门文章标签

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

在 Linux 中运行 MySQl(有/没有带有 phpmyadmin 的 podman 容器)
