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;
相关推荐
一 乐10 分钟前
校务管理|基于springboot + vueOA校务管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·spring
太行山有西瓜汁1 小时前
达梦DTS工具:批量导出与导入DDL脚本完整指南
运维·服务器·数据库
无盐海1 小时前
Redis 哨兵模式
数据库·redis·缓存
APItesterCris1 小时前
高并发场景下的挑战:1688 商品 API 的流量控制、缓存策略与异步处理方案
大数据·开发语言·数据库·缓存
·云扬·1 小时前
InnoDB锁监控与排查:从基础到实战
数据库·oracle
代码扳手1 小时前
Go 微服务数据库实现全解析:读写分离、缓存防护与生产级优化实战
数据库·后端·go
麦麦鸡腿堡1 小时前
Java_MySQL介绍
java·开发语言·mysql
shoubepatien1 小时前
JavaWeb_Web基础
java·开发语言·前端·数据库·intellij-idea
多云的夏天1 小时前
SpringBoot3+Vue3基础框架(1)-springboot+对接数据库表登录
数据库·spring boot·后端
cncdns-james1 小时前
SAP Hana Studio备份生产机数据库——【认识SAP HANA Studio篇】
数据库·sap·sap hana studio