当前位置: 首页 > news >正文

JSONB字段搜索走索引

JSONB介绍

PostgreSQL 数据库提供了一种特殊的数据类型叫做 JSONB,它是对 JSON 对象的原生支持,允许在数据库中存储和查询 JSON 数据。JSONB 是 JSON 类型的二进制版本,其相对于 JSON 类型来说,具有更高的效率和更好的性能。

以下是 JSONB 字段的一些特性和使用方式的详细介绍:

  1. 数据存储:
    • JSONB 数据在存储时会被转换成一个紧凑的内部二进制格式,这样并不会消耗大量的空间,而且查询速度更快。
    • 由于 JSONB 比较紧凑,因此在保存密集关键字和值的 JSON 数据时,与传统的表格数据存储相比,可以节省大量的空间。
  2. 模式匹配与搜索:
    • 你可以使用 SQL 查询对 JSONB 数据进行模式匹配搜索,这使得数据查询更加灵活。
    • 可以通过 PostgreSQL 的文本搜索功能整合 JSONB 字段,使得复杂的数据查询更加方便。
  3. 索引支持:
    • PostgreSQL 支持对 JSONB 字段中的键和值进行索引。这意味着在查询中对 JSONB 字段进行操作时,索引可以显著提升查询性能。
    • 用户可以为 JSONB 字段创建多种索引,例如键索引、路径索引等,从而在查询时提供更快的数据访问速度。
  4. 函数和操作符:
    • PostgreSQL 提供了一系列的专门用于 JSONB 的函数和操作符,如:
      • jsonb_typeof:返回 JSONB 值的类型。
      • jsonb_to_record:将 JSONB 对象转换为记录类型,以便访问其各个字段。
      • jsonb_set:用于更新或插入 JSONB 字段的键。
      • ->>:用于获取 JSONB 对象中键的值,它相当于文本模式的 ‘->’ 和 ‘>’。
  5. 复杂的结构处理:
    • JSONB 支持复杂的层次结构,可以通过指针(#>->)操作符以及 JSONB 函数来处理这些结构。
    • 这不仅适用于 JSONB 对象,还适用于数组等复杂结构。
  6. 动态SQL:
    • JSONB 可以非常容易地与动态SQL结合使用,为数据提供灵活性的同时,也保持了数据库设计的灵活性。
  7. 关系操作:
    • 若在 JSONB 数据中需要进行自引用或与关系表中的其他条目相关联的复杂场景,JSONB 可以成为一种方便的解决方案。

🎆【核心内容】JSONB字段搜索走索引

JSONB字段精确搜索还是可以走GIN索引的,但是对于模糊搜索不太好支持;

🧨创建索引

首先如果你需要精确搜索,首先建议创建一个索引

CREATE INDEX idx_resource_extension ON tb_test USING GIN (test_extension);

说明:

  • idx_resource_extension:索引名称
  • tb_test:表名
  • test_extension:JSONB字段名称

🧨编写搜索sql

对于字符串类型的子字段:

SELECT *
FROM tb_test
WHERE(test_extension @> '{"coins":["USDC"]}' or test_extension @> '{"coins":"USDC"}')

这里查询使用了test_extension @> ‘{“coins”:[“USDC”]}’ or test_extension @> ‘{“coins”:“USDC”}’,至于为什么会使用or连接2个查询条件,我想对于json类型字符串就是列表类型或单个字符串;

对于数字类型:

SELECT *
FROM tb_test
WHERE(test_extension @> '{"styleNumb":[9991]}' or resource_extension @> '{"styleNumb":9991}');

这里与上面字符串类型处理一样,但是对于是使用字符串类型还是数字类型,可在代码中进行提前判断,从而选择合适的sql,如果有问题可以进入我的博客给我留言哦~

其他补充说明

@>的含义与用法

在 PostgreSQL 中,@> 是 JSONB 类型的操作符,用于判断一个 JSONB 对象是否包含另一个 JSONB 对象。它是一个用于 JSONB 数据类型的包含操作符,用于检测左侧 JSONB 值是否包含右侧 JSONB 值。

用法与示例

  1. 基本语法

    jsonb_column @> jsonb_value
    

    其中 jsonb_column 是一个 JSONB 列,jsonb_value 是一个 JSONB 值。如果 jsonb_column 包含 jsonb_value,则结果为 TRUE,否则为 FALSE

  2. 示例

    假设有一个 tb_common_resource 表,其中有一个 JSONB 类型的列 resource_extension,列中的数据如下:

    [{"id": 1,"name": "Alice","tags": ["employee", "manager"]},{"id": 2,"name": "Bob","tags": ["employee"]}
    ]
    

    如果我们想查询包含特定 JSON 对象的行,例如包含 "tags": ["employee"] 的行,可以使用 @> 操作符:

    SELECT * FROM tb_common_resource
    WHERE resource_extension @> '{"tags": ["employee"]}';
    

    这个查询会返回所有 resource_extension 列中包含 "tags": ["employee"] 的行。在这个例子中,resource_extension 列中的 JSONB 数组包含两个对象,第一个对象包含 "tags": ["employee", "manager"],第二个对象包含 "tags": ["employee"]。所以这个查询将返回所有这两行数据。

  3. 用法细节

    • 键值对匹配@> 操作符可以用于匹配键值对,即在左侧 JSONB 对象中查找是否存在右侧 JSONB 对象中的所有键值对。
    • 部分匹配:不需要完全匹配整个 JSON 对象,只要左侧 JSONB 对象中包含右侧 JSONB 对象中的所有键值对就可以。
  4. 应用场景

    • 筛选和查询:常用于筛选和查询包含特定数据的记录,特别是当 JSONB 列用于存储具有复杂结构的数据时。
    • 数据验证:可以用于验证数据是否符合某些结构或条件。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【人工智能】常用的人工智能框架、模型、使用方法、应用场景以及代码实例的概述
  • 嵌入式实时操作系统VxWorks面试题及参考答案(4万字长文)
  • 学习笔记第十九天
  • 网络编程先验知识1
  • Flake8 和 Autopep8 使用指南
  • 用AI生成海报设计!AI绘画大模型Flux的在线使用!
  • 【NLP】文本预处理的概念、处理方法、数学公式
  • K8s集群里 中Flannel的状态显示为CrashLoopBackOff 时
  • Stable Diffusion绘画 | 提示词基础原理
  • 深度学习线性代数基础
  • 坐标变换矩阵
  • CentOS7 VMware虚拟机基于NAT配置网络IP
  • 【机器学习sklearn实战】岭回归、Lasso回归和弹性网络
  • PyCharm 2024.1 总结和最新变化
  • 大家不推荐开放式耳机?开放式耳机的优缺点
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • CSS魔法堂:Absolute Positioning就这个样
  • DOM的那些事
  • express如何解决request entity too large问题
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • java2019面试题北京
  • JavaScript 奇技淫巧
  • NSTimer学习笔记
  • SpringCloud集成分布式事务LCN (一)
  • Spring核心 Bean的高级装配
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 复习Javascript专题(四):js中的深浅拷贝
  • 关于Flux,Vuex,Redux的思考
  • 如何合理的规划jvm性能调优
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 算法系列——算法入门之递归分而治之思想的实现
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 正则学习笔记
  • 国内开源镜像站点
  • # Redis 入门到精通(一)数据类型(4)
  • # 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群
  • #100天计划# 2013年9月29日
  • #数据结构 笔记一
  • #预处理和函数的对比以及条件编译
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • ${ }的特别功能
  • (二)Linux——Linux常用指令
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (十六)一篇文章学会Java的常用API
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (学习日记)2024.01.09
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转)一些感悟
  • (自用)gtest单元测试
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • .net与java建立WebService再互相调用