我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Mysql怎么存储json格式数据详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Mysql怎么存储json格式数据详解

前言

Mysql5.7版本以后新增的功能,Mysql提供了一个原生的Json类型,Json值将不再以字符串的形式存储,而是采用一种允许快速读取文本元素(document elements)的内部二进制(internal binary)格式。在Json列插入或者更新的时候将会自动验证Json文本,未通过验证的文本将产生一个错误信息

JSON 数据类型推荐使用在不经常更新的静态数据存储

创建表 t_user

CREATE TABLE `t_user_tag` (
  `id` int NOT NULL AUTO_INCREMENT,
  `tag_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '标签名称',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

登录方式字段使用json格式,分为phone,wechat,qq,email,zhifubao等等

插入数据:

insert into t_user values (1,'tom', 25, '{"email": "1324@qq.com", "phone": "13200001111", "wechat": "147258369"}');
insert into t_user values (2,'jack', 30, '{"phone": "13500001111"}');
insert into t_user values (3,'lily', 18, '{"qq": "147258369", "phone": "13600001111"}');
insert into t_user values (4,'lily', 45, '{"wechat":"1884875663"}');

查询

用户名,手机号,微信号

select name,
(JSON_EXTRACT(login_info, '$.phone')) phone,
JSON_UNQUOTE(JSON_EXTRACT(login_info, '$.wechat')) wechat
from t_user;

 可以看出

JSON_UNQUOTE 函数作用是 去除json字符串的引号,将值转成string类型

JSON_EXTRACT 函数作用是 提取json值

简洁的写法作用等同于上面的

select name,
login_info ->> '$.phone' phone,
login_info ->> '$.wechat' wechat
from t_user;

 ->> 表达式 等同于 JSON_UNQUOTE(JSON_EXTRACT(login_info, '$.wechat'))

-- 使用json中的字段作为查询条件
select name,
login_info ->> '$.phone' phone,
login_info ->> '$.wechat' wechat
from t_user
where login_info ->> '$.phone' = '13200001111';

 

json数据 增加索引

 给login_info字段中的手机号增加索引

-- 给login_info这个json中的phone增加索引
alter table t_user add COLUMN phone varchar(11) as (login_info ->> '$.phone');
alter table t_user add UNIQUE INDEX idx_uq_phone(phone);

上述 SQL 首先创建了一个虚拟列 phone,这个列是由函数 login_info->>"$.phone" 计算得到的。然后在这个虚拟列上创建一个唯一索引 idx_uq_phone。这时再通过虚拟列 phone进行查询,就可以看到优化器会使用到新创建的 idx_uq_phone 索引

-- 查看索引
EXPLAIN
select *
from t_user
where phone = '13200001111';

 我们查看表结构,发现索引增加上去了

使用场景

某些业务需要做用户画像(也就是对用户打标签),然后根据用户的标签,通过数据挖掘技术,进行相应的产品推荐。比如:

在电商行业中,根据用户的穿搭喜好,推荐相应的商品;

在音乐行业中,根据用户喜欢的音乐风格和常听的歌手,推荐相应的歌曲;

在金融行业,根据用户的风险喜好和投资经验,推荐相应的理财产品。

在这,我强烈推荐你用 JSON 类型在数据库中存储用户画像信息,并结合 JSON 数组类型和多值索引的特点进行高效查询。

创建用户画像定义表:

CREATE TABLE `t_tag` (
  `id` int NOT NULL AUTO_INCREMENT,
  `tag_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '标签名称',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

insert into t_tag values (null, '70后');
insert into t_tag values (null, '80后');
insert into t_tag values (null, '90后');
insert into t_tag values (null, '00后');
insert into t_tag values (null, '10后');
insert into t_tag values (null, '爱运动');
insert into t_tag values (null, '爱听歌');
insert into t_tag values (null, '爱看电影');
insert into t_tag values (null, '高学历');
insert into t_tag values (null, '小资');
insert into t_tag values (null, '有车');
insert into t_tag values (null, '有小孩');
insert into t_tag values (null, '喜欢网购');
insert into t_tag values (null, '喜欢点外卖');
insert into t_tag values (null, '萝莉');

 创建用户标签中间表

CREATE TABLE `t_user_tag` (
  `user_id` int NOT NULL COMMENT '用户id',
  `tag_id` json NOT NULL COMMENT '用户标签id',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

 插入数据,使用数组的形式存储

insert into t_user_tag values (1,'[2,4,6]');
insert into t_user_tag values (2,'[1,3,7]');
insert into t_user_tag values (3,'[8,10,12]');

 

 MySQL 8.0.17 版本开始支持 Multi-Valued Indexes,用于在 JSON 数组上创建索引,并通过函数 member of、json_contains、json_overlaps 来快速检索索引数据。所以你可以在表 UserTag 上创建 Multi-Valued Indexes:

ALTER TABLE t_user_tag
ADD INDEX idx_user_tags ((cast((tag_id->"$") as unsigned array)));

 查询爱看电影的

select * from t_user_tag
where 8 MEMBER OF(tag_id -> '$');

 查询爱看电影,且有小孩的

select * from t_user_tag
where JSON_CONTAINS(tag_id -> '$', '[8,10]');

使用 JSON 数据类型,推荐用 MySQL 8.0.17 以上的版本,性能更好,同时也支持 Multi-Valued Indexes;

JSON 数据类型的好处是无须预先定义列,数据本身就具有很好的描述性;

不要将有明显关系型的数据用 JSON 存储,如用户余额、用户姓名、用户身份证等,这些都是每个用户必须包含的数据;

JSON 数据类型推荐使用在不经常更新的静态数据存储。

总结 

到此这篇关于Mysql怎么存储json格式数据的文章就介绍到这了,更多相关Mysql存储json格式内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Mysql怎么存储json格式数据详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

hive怎么存储json格式的数据

正文Hive通过SerDes支持存储和处理JSON数据,将其转换为Hive表中的结构,以便查询分析。可通过自定义SerDes和LOAD语句存储JSON数据。Hive内置函数(如get_json_object())可解析JSON数据。Hive支持存储嵌套JSON结构,并可通过Map/Array类型SerDes实现。优化JSON处理可通过索引、自定义SerDes和JSON工具来提升性能。
hive怎么存储json格式的数据
2024-04-09

hive怎么存储json格式的数据

在Hive中存储JSON格式的数据通常有两种方法:使用Hive的内置JSON SerDe(Serializer/Deserializer):Hive提供了org.apache.hive.hcatalog.data.JsonSerDe类来处理
hive怎么存储json格式的数据
2024-04-09

MYSQL中解析json格式数据

MYSQL中解析json格式数据 1、判断是否是json格式数据 JSON_VALID(requestbody) 注:requestbody为指定字段 2、解析json中的指定字段(可多层嵌套) JSON_EXTRACT(requestbo
2023-08-19

Android中怎么解析JSON格式数据

这期内容当中小编将会给大家带来有关Android中怎么解析JSON格式数据,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。JSON格式 : { "name_A" : "value_A","name_B" :
2023-05-30

redis储存数据格式是什么

Redis支持多种不同的数据格式来存储数据,每种格式都有其特定的用途和优势。1. 字符串(String):最简单的数据结构,可以存储字符串、整数或浮点数。2. 列表(List):有序的字符串列表,可以在列表的两端(头部或尾部)执行插入或删除
2023-08-24

hive数据存储格式是什么

Hive数据存储格式通常是以文本文件的形式存储,常见的格式包括:文本文件:数据以文本形式存储,通常使用逗号、制表符或其他分隔符将不同字段的数据分隔开。Parquet文件:Parquet是一种列式存储格式,能够有效地压缩数据并提高查询性能。
hive数据存储格式是什么
2024-04-12

MySQL怎么存储无模式的数据

MySQL是关系型数据库管理系统,不支持直接存储无模式的数据。无模式的数据通常指的是非结构化或半结构化数据,例如文本文件、图像、音频、视频等。在MySQL中,对于非结构化或半结构化数据,可以将其存储在文件系统中,并在数据库中保存对应的文件路
2023-08-23

Couchbase的数据存储格式是什么

Couchbase使用的数据存储格式是JSON(JavaScript Object Notation)。JSON是一种轻量级的数据交换格式,易于阅读和编写,同时也易于解析和生成。在Couchbase中,数据以JSON文档的形式存储在数据库中
Couchbase的数据存储格式是什么
2024-04-09

怎么将json数据储存到mongodb中

将JSON数据存储到MongoDB数据库中,需要建立连接、转换JSON数据、插入文档。PyMongo库提供便捷方法简化交互,如查询集合。bson库用于处理MongoDB的BSON数据格式。注意数据类型兼容性和性能优化,并定期备份。
怎么将json数据储存到mongodb中
2024-04-12

python怎么读取和存储dict()与.json格式文件

本文小编为大家详细介绍“python怎么读取和存储dict()与.json格式文件”,内容详细,步骤清晰,细节处理妥当,希望这篇“python怎么读取和存储dict()与.json格式文件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入
2023-07-02

Python怎么读写JSON格式数据

今天小编给大家分享一下Python怎么读写JSON格式数据的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。JSON格式数据简介
2023-07-05

SpringBoot怎么返回Json数据格式

这篇文章主要介绍“SpringBoot怎么返回Json数据格式”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot怎么返回Json数据格式”文章能帮助大家解决问题。一、@RestCon
2023-07-05

MYSQL中解析json格式数据方法示例

目录1、判断是否是json格式数据2、解析json中的指定字段(可多层嵌套)3、计算json中指定数组的长度4、完整示例总结 1、判断是否是json格式数据JSON_VALID(requestbody)注http://www.cppcn
2023-08-19

编程热搜

目录