mysql JSON特性优化

有朋友问到,mysql如果要根据json中的某个属性过滤,数据量大的话,性能很差,要如何提高性能?

为什么要用json串?

由于一些特定场景,mysql需要用到json串,例如文档,不同的文档可能包含的属性不一样,且属性个数较多,这个时候用json存储比较合适,不然用宽表,影响性能,维护也麻烦(例如后期新增属性之类的)

好了,不废话,直接上方案

前置条件

创建表test,包含如下数据

常规的过滤

(全表扫描,效率低)

sql 复制代码
select id,name,extra from test where extra->'$.tid'='t3';

如何提升性能?

这里可以根据mysql5.7引入的虚拟列来解决

sql 复制代码
ALTER TABLE test ADD COLUMN v_tid varchar(32) GENERATED ALWAYS AS (
	JSON_UNQUOTE(
	JSON_EXTRACT( extra, _utf8mb4 '$.tid' ))) VIRTUAL NULL;

后面可以为这个虚拟列创建索引,根据虚拟列来过滤即可

sql 复制代码
select id,name,extra from test where v_tid='t3';

注意:如果要删除虚拟列,可以执行如下语句

sql 复制代码
ALTER TABLE test DROP COLUMN v_tid;
相关推荐
IvorySQL4 小时前
PG 日报|新增 VACUUM 全维度统计信息补丁迭代
数据库·人工智能·postgresql·ivorysql
白露与泡影7 小时前
Redis 缓存实战:雪崩、穿透、击穿一次讲透
数据库·redis·缓存
赵渝强老师8 小时前
【赵渝强老师】使用Oracle可传输的表空间迁移数据
数据库·oracle
IpdataCloud9 小时前
跨区服玩家延迟高怎么办?用IP离线库自动分配到最近服务器
数据库·tcp/ip·github·php·ip
wuqingshun31415910 小时前
MYSQL默认的事务隔离级别是什么?为什么选择这个级别?
数据库·mysql
空中湖10 小时前
电池简史(五):极限之梦与终章——锂硫、锂空气、量子电池,以及你该知道的电池投资与生活指南
数据库·程序人生
蓝胖子酱11 小时前
在 Electron 中用 electron-store 实现加密存储与自定义格式文件
前端·javascript·数据库
snow@li12 小时前
Redis:数据库语法速查表 / 全景梳理
数据库·redis·缓存
Devlive 开源社区12 小时前
Nebula 1.6.0 发布:跨区域桶自动路由、秒传、文本/PDF 预览一次到位
数据库·sql
这个DBA有点耶13 小时前
导个数据中文全变问号?字符集这事儿真没那么简单
数据库·mysql·代码规范