太实用了!JSON在Mysql中原来可以这么玩

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 太实用了!JSON在Mysql中原来可以这么玩

一、背景



最近接手做一个医疗项目,其中有一个需求是给病人做统计报表,其实这个之前是有过一版的,只是上到线上就立刻崩了。崩溃的原因也很简单,前端接受到数据量达到了400-500M,然后还要前端对这些数据进行处理、渲染,不卡死才怪。前端进行数据处理的原因是:当时后端工作量大,数据没有处理直接一骨碌全部返回给前端,而且前端页面需要显示不同的统计图和表格,数据的处理方式不一样。


了解了原因之后,就要查看具体的后端代码了。这是一个新上线的服务,按道理数据量不会很大。于是我进一步查看后台逻辑,其实关联的表也不过5张,数据条数也不超过5000条,这个数据量,按道理是不会崩溃才对,然后进一步查看,其中一张表存了一个report字段,字段类型为json,这个字段奇大无比,而且后端解析的逻辑也很多,解析好后,还要把这个字段返回给前端,重复了。来感受一下这个字段的恐惧吧,算了,太长了,还是放在本文的末尾吧,不然估计你都没兴趣看下面的正文的内容了,如果有兴趣的,可以翻到本文末尾来体会一下绝望吧。


二、解决办法



  1. 查看原需求文档,定位出报表需要用到的字段


  1. 第一个方案是将report字段分解,然后存到另外一张表,报表的时候再关联到这张分解好的表。但是这个需要一个定时任务来同步分解这个字段。后来查看mysql的文档看到了一个函数json_extract,简直可以完美解决我目前遇到的这问题。那张大表我是无力改了,和业务深度关联,费时费力。通过sql的手段直接减少绝大部分的数据量。


  1. 后端做报表数据分析处理,前端只需要渲染


三、json_extract的使用方法



  1. 获取value为非集合类型:统计报表中有一个体质,其中对应report字段中health_report.const_section.const_code,那么怎么截取出来呢?


SELECT 
    json_extract(json_extract(json_extract(r.report,"$.health_report"),"$.const_section"),"$.const_code") as physique 
from 
    `habitus_report` r;

640.png


2. 获取value为非集合类型:统计报表中的疾病类型,是report字段中health_report.const_detail.disease_id,这个疾病类型是一个数组,我需要的只是疾病id,实现代码如下:


select
    json_extract(json_extract(json_extract(json_extract(r.report,"$.health_report"),"$.const_detail"),"$.diseases"),"$[*].disease_id") as diseaseIds
from
   `habitus_report` r;

640.png


截取完之后,返回给后端的数据节省了98%的大小,是不是很实用?


四、mysql中其它json处理函数用法简介



4.1 创建json


  1. JSON_OBJECT([key, val[, key, val] ...]):创建json对象
mysql> SELECT JSON_OBJECT('key1', 1, 'key2', 'abc', 'key1', 'def') as jsonObj;
+------------------------------------------------------+
| jsonObj 
+------------------------------------------------------+
| {"key1": 1, "key2": "abc"}                           
+------------------------------------------------------+


  1. JSON_ARRAY([val[, val] ...]):创建json数组
mysql> SELECT JSON_ARRAY('a', 1, NOW()) as jsonArr;
+----------------------------------------+
| jsonArr              
+----------------------------------------+
| ["a", 1, "2015-07-27 09:43:47.000000"] 
+----------------------------------------+


4.2 修改json


  1. JSON_SET(json_doc, path, val[, path, val] ...):有存在的数据就替换,没有就插入
SET @j = '["a", {"b": [true, false]}, [10, 20]]';
mysql> SELECT JSON_SET(@j, '$[1].b[0]', 1, '$[2][2]', 2) as jsonSet;
+--------------------------------------------+
| jsonSet 
+--------------------------------------------+
| ["a", {"b": [1, false]}, [10, 20, 2]]      
+--------------------------------------------+


  1. JSON_INSERT(json_doc, path, val[, path, val] ...):在JSON数组后增加新的数据
SET @j = '["a", {"b": [true, false]}, [10, 20]]';
mysql> SELECT JSON_INSERT(@j, '$[1].b[0]', 1, '$[2][2]', 2) as jsonInsert;
+-----------------------------------------------+
| JSON_INSERT(@j, '$[1].b[0]', 1, '$[2][2]', 2) |
+-----------------------------------------------+
| ["a", {"b": [true, false]}, [10, 20, 2]]      |


  1. JSON_REMOVE(json_doc, path[, path] ...):删除原json中的值
SET @j = '["a", {"b": [true, false]}, [10, 20]]';
--删除指标为2的值、删除指标为1里指标为1的值
mysql> SELECT JSON_REMOVE(@j, '$[2]', '$[1].b[1]', '$[1].b[1]');
+---------------------------------------------------+
| JSON_REMOVE(@j, '$[2]', '$[1].b[1]', '$[1].b[1]') |
+---------------------------------------------------+
| ["a", {"b": [true]}]                              |


  1. JSON_REPLACE(json_doc, path, val[, path, val] ...):替换一部分JSON数据
mysql> SELECT JSON_REPLACE(@j, '$[1].b[0]', 1, '$[2][2]', 2);
+------------------------------------------------+
| JSON_REPLACE(@j, '$[1].b[0]', 1, '$[2][2]', 2) |
+------------------------------------------------+
| ["a", {"b": [1, false]}, [10, 20]]             |
+------------------------------------------------+


4.3 合并json数据


  1. JSON_REMOVE(json_doc, path[, path] ...):将两个json合并
mysql> SELECT JSON_MERGE('{"a": 1, "b": 2}', '{"c": 3, "a": 4}');
+----------------------------------------------------+
| JSON_MERGE('{"a": 1, "b": 2}', '{"c": 3, "a": 4}') |
+----------------------------------------------------+
| {"a": [1, 4], "b": 2, "c": 3}                      |
+----------------------------------------------------+


4.4 查询json数据


  1. JSON_CONTAINS(json_doc, val[, path]):是否包含
  2. JSON_CONTAINS_PATH(json_doc, one_or_all, path[, path] ...):查找path(就是key)是否存在
  3. JSON_EXTRACT(json_doc, path[, path] ...):分解JSON 并查询,实际上就是在提供的path下查找值
  4. JSON_KEYS(json_doc[, path]):提出当前提供path下的key值
  5. JSON_SEARCH(json_doc, one_or_all, search_str[, escape_char[, path] ...]):按着提供的值去查询,返回path数组。one_or_all南


4.5 查询JSON自有属性的方法


  1. JSON_DEPTH(json_doc):查询当前JSON深度
  2. JSON_LENGTH(json_doc[, path]):查询当前层级(path)下对象或者数组的元素数量
  3. JSON_TYPE(json_val):返回JSON值类型
  4. JSON_VALID(val):json校验


4.6 将其它类型转换为json类型


  1. CAST(value AS JSON):将其它类型转换为json类型
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
JSON 关系型数据库 MySQL
MySQL JSON数据存储结构与操作
通过本文的介绍,我们了解了MySQL中JSON数据类型的基本操作、常用JSON函数、以及如何通过索引和优化来提高查询性能。JSON数据类型为存储和操作结构化数据提供了灵活性和便利性,在现代数据库应用中具有广泛的应用前景。希望本文对您在MySQL中使用JSON数据类型有所帮助。
122 0
|
4月前
|
存储 JSON 关系型数据库
MySQL与JSON的邂逅:开启大数据分析新纪元
MySQL与JSON的邂逅:开启大数据分析新纪元
|
6月前
|
JSON 关系型数据库 MySQL
MySQL中GROUP_CONCAT与JSON_OBJECT、GROUP BY的巧妙结合:打造高效JSON数组汇总
MySQL中GROUP_CONCAT与JSON_OBJECT、GROUP BY的巧妙结合:打造高效JSON数组汇总
192 1
|
6月前
|
JSON 关系型数据库 MySQL
理解和利用MySQL中的JSON功能
理解和利用MySQL中的JSON功能
278 2
|
6月前
|
JSON 关系型数据库 MySQL
实时计算 Flink版产品使用问题之在使用CDAS语法同步MySQL数据到Hologres时,如果开启了字段类型宽容模式,MySQL中的JSON类型会被转换为什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
6月前
|
存储 JSON 关系型数据库
MySQL JSON 类型:功能与应用
MySQL JSON 类型:功能与应用
|
7月前
|
SQL JSON 关系型数据库
MYSQL--JSON_OBJECT 和 JSON_ARRAYAGG
MYSQL--JSON_OBJECT 和 JSON_ARRAYAGG
220 0
|
JSON 前端开发 JavaScript
MySQL 8.0 可以操作 JSON 了,牛逼。。。
MySQL 8.0 可以操作 JSON 了,牛逼。。。
271 0
|
JSON 前端开发 JavaScript
MySQL 8.0 可以操作 JSON 了,牛逼。。。
简单概述 不允许为null; Json格式定义与LONGBLOB or LONGTEXT类似; 它的最大长度是受到max_allowed_packet所控制的; 查看JSON字段所占用空间大小的函数时JSON_STORAGE_SIZE(xxx); 除普通的Json操作,额外支持GeoJSON (基于几何图形的针对地理空间数据交换格式)一些相关操作; 对Json栏位支持索引(结合Mysql8.0新特性,函数index); 一个可以支持部分的,原地更新Json Column 的可选优化项加入MySql8.0; 可以使用的函数有JSON_SET(), JSON_REPLACE() ,JSON_RE
655 0
|
2月前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道