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

Good Idea, 利用MySQL JSON特性优化千万级文库表

👳我亲爱的各位大佬们好😘😘😘
♨️本篇文章记录的为 利用MySQL JSON特性优化千万级文库表 相关内容,适合在学Java的小白,帮助新手快速上手,也适合复习中,面试中的大佬🙉🙉🙉。
♨️如果文章有什么需要改进的地方还请大佬不吝赐教❤️🧡💛
👨‍🔧 个人主页 : 阿千弟
🔥 上期内容👉👉👉 : AOP的另类用法 (权限校验&&自定义注解)

前言:

一个类似于知网,范围又不局限于论文的这样的一个高质量文库,比如图书呢,它也有着与图书专属的这种类型属性,那像这样的底层的数据表呢,有几十个,都是围绕着一份文档来进行的描述,那刚开始构建的时候,我的哥们遇到了一个比较棘手的问题,就是不同类型的图书呢,他们所使用的属性是不一样的😥😥😥.

在这里插入图片描述

问题描述: 多表关联查询, 效率低

比如说图书类的文档呢,它可能会包含SBN、出版社这些信息,而论文类的呢,它要发表在报纸、期刊、杂志上,同时呢,还要去登记版号、版面等等这些信息,至于其他的,比如说一些网文或者一些高价值的文章呢,也都有自己的一些专有的属性,那么这就意味着在进行一个文档提取的时候,前台要显示出来,我们要底层查询的表其实是很多的.
在这里插入图片描述

我简单的罗列一下,比如说先要获取文档的主体的内容,然后去获取对应这个文档是哪个类型的,之后呢,再获取这个文档所拥有的哪些属性,比如说这个文档是个图书的话,那么它要获取SBN和出版社,然后再根据刚才的SBN和出版社获取这个文档,存在一些多对多的关系,那除此以外,还有比如说其他若干个基础信息都分散在了不同的表里边,那么我们可以看到针对于这一个操作来说,它呢其实包含了很多个数据表的查询和关联,这个处理效率在它们之前没有经过优化的时候呢,大概需要200毫秒时间才能把这些数据都提取完,那后来他们是怎么调整的呢?

在这里插入图片描述

解决方案一 : 反范式设计

一个版本,这个1.0呢,就是采用反范式设计,基于宽表,也就是我们典型的空间换时间,可以看到刚才我们处理慢的一个主要思路呢,就是一个数据表要查询多次才能获得完整的信息。那如果我们把这些数据都。综合到一个宽表里边儿,也就是我们反范式表是不是就可以了呢?
在这里插入图片描述
其实这个思路非常的好,我们可以比如说把所有的属性呢,以列的形式在这儿呢,都进行体现出来

弊端

在当前的这个宽表中呢,包含了所有可能会出现的属性,哪一个属性有数据,我们就提取哪一个,但是针对宽表呢,在我们日常工作中啊,并不太推荐使用,有两个原因 :

  • 它的字段一多以后,字段的动态填充和减少是要锁表的,尤其在数据量一大的时候,比如现在我们针对某一个杂文又有一个新的属性,你一旦添加列的时候,整个这个表就锁了。 对于我们的维护非常的不方便.
  • 数据查询的时候非常麻烦,难以基于动态列的方式来进行了提取数据
  • 作为宽表还有一些不能解决的问题,难以体现出一对多的关系

在这里插入图片描述

解决方案二 : mysql5.7后Json特性

采用mysql5.7之后所提供的一个叫Json的数据类型,所谓Json数据类型啊,其实就是把我们日常开发中数据序列化产生的这个Json直接存储到了mysql的对应的Json列里边,作为MYSQL5.7以后天然的对于这个Jason的存储解析,还有提取呢,都进行了支持

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

创建json列

这里模拟插入一条假数据

INSERT INTO t_base_data VALUES (1,'量子纠缠理论', '{ "caption": "量子领域","brandId": 103,"category1Id": 903,"category2Id": 945,"category3Id": 946,"freightId": 10 ,"image":"https://img14.360buyimg.com/n1/jfs/t1/181065/5/3216/48663/6098c03fEad0ea4e5/659d59d79f8d0043.jpg","introduction": "遇事不决,量子力学","saleService": "实验室实战","templateId": 42}'
);

执行sql语句

SELECT NAME,
(JSON_EXTRACT(content, '$.brandId')) brandId,
JSON_UNQUOTE(JSON_EXTRACT(content, '$.caption')) caption
FROM t_base_data;

在这里插入图片描述

可以看出

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

  • JSON_EXTRACT 函数作用是 提取json值

使用json中的字段作为查询条件

SELECT NAME,content -> '$.brandId' brandId,content -> '$.caption' caption
FROM t_base_dataWHERE content -> '$.templateId' = 42;

在这里插入图片描述

  • -> 表达式 等同于 JSON_EXTRACT(content , '$.caption'))
SELECT NAME,content ->> '$.brandId' brandId,content ->> '$.caption' caption
FROM t_base_dataWHERE content -> '$.templateId' = 42;

在这里插入图片描述

  • ->> 表达式 等同于 JSON_UNQUOTE(JSON_EXTRACT(content , ‘$.caption’))

很好, 通过上面的方法, 我们可以很好的将弱关联字段查询出来了, 但是呢, 这个方式仍然不够完美, 虽然解决了链表查询耗时的问题, 但是我们如果想在千万级的数据中查询出我们所期望的这仍然很耗时

不妨尝试建立索引, 我们该怎么建索引呢?

小老弟小老妹们可能就要问了, 都是json串, 怎么建立索引呢

也许你们忘了一种叫做虚拟列的东西

在这里插入图片描述

继续优化

1. 创建虚拟列

ALTER TABLE t_base_data ADD COLUMN tb_templateId VARCHAR(32) GENERATED ALWAYS AS (content -> '$.templateId');

在这里插入图片描述
那与此同时呢,还有一个优秀的特点,基于这样书写以后,如果我们原始的Json数据发生了变化,只要一更新以后,对应的结果也会随之发生对应,从使用的角度来说,它就是一个标准的字段,只不过这个字段呢,只能读不能写而已

2. 将索引创建在虚拟列上

CREATE INDEX idx_tb_templated ON t_base_data(tb_templateId);EXPLAIN SELECT * FROM t_base_data WHERE `tb_templateId` = 43;

在这里插入图片描述

可以看到索引已经生效, 问题完美解决

总结 : 效率高, json实用性强

  • 利用JSON解决动态数据问题,MySQL5.7以后提供了JSON数据类型,可以直接对JSON存储、提取与解析。
  • 因为JSON是弱约束的,因此存储数据非常灵活,同时也可基于虚拟列实现索引优化。

我的哥们儿把数据的查询效率一下子提升了有十几倍之多,这是一个非常好的办法, 在未来的项目中,我也会考虑基于Jason的这种活性呢,来优化我们的程序结构

在这里插入图片描述

如果这篇【文章】有帮助到你💖,希望可以给我点个赞👍,创作不易,如果有对Java后端或者对spring感兴趣的朋友,请多多关注💖💖💖
👨‍🔧 个人主页 : 阿千弟

相关文章:

Good Idea, 利用MySQL JSON特性优化千万级文库表

👳我亲爱的各位大佬们好😘😘😘 ♨️本篇文章记录的为 利用MySQL JSON特性优化千万级文库表 相关内容,适合在学Java的小白,帮助新手快速上手,也适合复习中,面试中的大佬🙉🙉&#x1f…...

【python游戏制作】快来跟愤怒的小鸟一起攻击肥猪们的堡垒吧

前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 为了防止/报复偷走鸟蛋的肥猪们,鸟儿以自己的身体为武器, 仿佛炮弹一样去攻击肥猪们的堡垒,保卫自己的鸟蛋 这个游戏大家没玩过的想必也听说过~ 今天就给大家分享一下用python写的愤怒的…...

ARM 学习(一)

ARM 处理器的运行模式ARM处理器共有7种运行模式,如下表所示:处理器模式描述用户模式(User)正常程序运行模式中断模式(IRQ)用于通常的中断处理快速中断模式(FIQ)用于高速传输和通道处…...

深入分析Java的序列化与反序列化

序列化是一种对象持久化的手段。普遍应用在网络传输、RMI等场景中。本文通过分析ArrayList的序列化来介绍Java序列化的相关内容。主要涉及到以下几个问题: 怎么实现Java的序列化 为什么实现了java.io.Serializable接口才能被序列化 transient的作用是什么 怎么自…...

、Tomcat源码分析-类加载器

接下来,我们再来看下 tomcat 是如何创建 common 类加载器的。关键代码如下所示,在创建类加载器时,会读取相关的路径配置,并把路径封装成 Repository 对象,然后交给 ClassLoaderFactory 创建类加载器。 Bootstrap.java…...

反转链表相关的练习(下)

目录 一、回文链表 二、 重排链表 三、旋转链表 一、回文链表 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 示例 1: 输入:head [1,2,2,1] 输…...

2.进程和线程

1.进程1.1 终止正常退出(自愿)出错退出(自愿)严重错误(非自愿)被其他进程杀死(非自愿)1.2 状态就绪态:可运行,但因为其他进程正在运行而暂时停止阻塞态:除非某种外部事件发生,否则进程不能运行1.3 实现一个进程在执行过程中可能被…...

C++回顾(十四)—— 函数模板

14.1 概述 所谓函数模板(function template),实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数&a…...

如何做好项目各干系人的管理及应对?

如何更好地识别、分析和管理项目关系人?主要有以下几个方面: 1、项目干系人的分析 一般对项目干系人的分析有2种方法, 方法一:权利(影响),即对项目可以产生影响的人; 方法二&#xf…...

Elasticsearch使用系列-ES增删查改基本操作+ik分词

一、安装可视化工具KibanaES是一个NoSql数据库应用。和其他数据库一样,我们为了方便操作查看它,需要安装一个可视化工具 Kibana。官网:https://www.elastic.co/cn/downloads/kibana和前面安装ES一样,选中对应的环境下载&#xff0…...

07-PL/SQL基础(if语句,case语句,循环语句)

本章主要内容: 1.PL/SQL的基本构成:declare,begin,exception,end; 2.结构控制语句:IF语句,CASE语句 3.循环结构:loop循环,for loop循环,while loop循环 PL/SQL的基本构成 特点 PL/SQL语言是SQL语言的扩展&#xff…...

信捷 XDH Ethercat A_VELMOVE

本文描述信捷 EthercatA_VELMOVE指令,以设定的速度持续运行 上图中,在M100的上升沿,执行A_VELMOVE指令。A_VELMOVE HD100 D100 M101 K0HD100输入参数起始地址 ,HD118输入参数末尾地址HD100~HD103,双精度浮点数(64位&am…...

【专项训练】分治、回溯

分治、回溯其实就是递归,只是是递归的一个细分,是一种特殊的递归 碰到一个题目,你就找他的重复性 最近重复性:根据重复性怎么构造以及如何分解,包括:分治、回溯 最优重复性:动态规划 本质:找重复性、分解问题、组合子问题的结果 回溯:试错! 50. Pow(x, n) https:…...

Linux上安装配置ZooKeeper

Linux上安装配置ZooKeeper 下载压缩文件 将压缩文件拷贝到指定目录下 执行命令 tar -zxvf [apache-zookeeper-3.5.7-bin.tar.gz] -C [/opt/module/]注:第一个括号里面是压缩文件名称,第二个括号里面是解压到指定的目录 进入到解压后的文件夹当中&am…...

idea leetcode插件无法登录

em 2022某天 leetcode-cn.com 改为了 leetcode.cn so , 如果是版本比较老idea leetcode插件, 就无法使用了. 因为用的旧域名 先说解决办法: 2.0 先把旧版本卸载了 2.1 ideaplugin官网找到本地idea版本下可安装的最高版本的leetcode.cn 假设是 leetcode-editor-6.9.zip 2.2 下…...

VR会议不断升级,为商务会谈打造云端洽谈服务!

VR会议不断升级,为商务会谈打造云端洽谈服务。在商务合作中,对客户需求的理解以及与客户讲解方案都需要建立在一个有效的沟通上,因此VR会议的用武之地就有了,以VR全景技术为核心,通过同屏互动和全景通信技术&#xff0…...

Ubuntu系统开机自动挂载NTFS硬盘【超实用】

由于跑深度学习实验(图像分割)f非常消耗内存,系统盘sda1内存小,配置了一个大容量得出NTFS机械盘,网上招了一些资料如何挂在,但是每次开机得手动挂载一遍才能使用硬盘,非常不方便,还容易造成数据丢失。 Step…...

淘宝十年资深架构师吐血总结淘宝的数据库架构设计和采用的技术手段。

淘宝十年资深架构师吐血总结淘宝的数据库架构设计和采用的技术手段。 文章目录淘宝十年资深架构师吐血总结淘宝的数据库架构设计和采用的技术手段。本文导读1.分库分表2.数据冗余3.异步复制4.读写分离总结本文导读 淘宝的数据库架构设计采用了分布式数据库技术,通过…...

训练自己的GPT2-Chinese模型

文章目录效果抢先看准备工作环境搭建创建虚拟环境训练&预测项目结构模型预测续写训练模型遇到的问题及解决办法显存不足生成的内容一样文末效果抢先看 准备工作 从GitHub上拉去项目到本地,准备已训练好的模型百度网盘:提取码【9dvu】。 gpt2对联训…...

springcloud3 fegin服务超时的配置和日志级别的配置2

一 fegin的概述 1.1 fegin的默认超时时间 默认fegin客户端只等待1秒钟,超过1秒钟,直接会返回错误。 1.2 架构图 1.2.1 说明 1.2.2 启动操作 1.先启动9001,9002 eureka 2.启动9003 服务提供者 3.启动9006消费者 1.3 情况验证 1.3.1 正常默认情…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

数据链路层的主要功能是什么

数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...