数据库优化:读写分离,并在SpringBoot项目中代码实现

什么要对数据库做读写分离优化。

存在下面两个问题,所以要进行数据库优化

  1. 单表不能太大:mysql官方说法:单表2000万数据,就到达瓶颈了。,所以说为了保证查询效率,得让每张表的大小得到控制。
  2. 查询压力大:在项目中往往是 查询使用的频率 》 增删改的使用的频率,也就是,读的频率》 写的频率

读的使用频率大,写的使用频率小,所以我们可以考虑 读用一个数据库,写用一个数据库

MySQL支持的两主架构通常指的是主从复制(Master-Slave Replication)和主主复制(Master-Master Replication),它们都是用来实现数据库的数据备份、负载均衡和高可用性的方案。

主主模式

        在主主复制中,有两个数据库充当主数据库,每个主数据库都可以处理写入和读取操作。这种架构常用于需要高可用性和负载均衡的场景。但是,主主复制需要更复杂的配置和处理冲突的机制,因为两个主数据库都可以同时进行写入操作,可能会导致数据冲突。 

实现方式

读数据的时候,从两个主数据库中任意一个去查询

写数据得时候

第一种:一个数据库有变更数据,就自动同步到另一个数据库

第二种:双写,写完一个数据库的时候,再把另一个数据库也写了。

主主复制的特点:

  • 高可用性:即使一个主数据库发生故障,另一个主数据库仍然可用。
  • 负载均衡:两个主数据库共同处理写操作,有助于分散负载。
  • 写入冲突:由于两个主数据库都可以写入数据,可能需要解决数据冲突问题

总结:因为它有可能会数据冲突,所以还是有缺陷,不推荐。

主从模式

 如上图所示,在主从复制中,有一个主数据库(Master)和一个或多个从数据库(Slave)。

主数据库负责处理写入操作(INSERT、UPDATE、DELETE等),而从数据库则复制主数据库的数据更改,通常用于读操作。

也就是 主数据库增删改的时候自动同步到从数据库

主从复制的特点:

  • 读写分离:主数据库处理写操作,从数据库处理读操作,从而分担负载。
  • 数据备份:从数据库可以用于灾难恢复和数据备份。
  • 负载均衡:通过将读流量分散到多个从数据库,可以实现负载均衡。
  • 自动晋升:在主数据库出现故障时,可以将一个从数据库提升为新的主数据库。

总结:只做到了缓解查询压力,但是没有解决数据库单表太大的问题,因为主库还是有全部的数据,没有其他库可以为它分担一些压力,所以还是不推荐。

多主多从

为了解决主从模式的问题,我们可以使用多主多重的模式。

将表拆开,拆成几个子表,然后分别使用主从模式,这样就解决了主从模式没有解决数据库单表太大的问题。

实现方式

具体怎么查分表?可以用取余的操作,如果你要拆分成3个子表,那就对3进行取余,余0一个表,余1一个表,余2一个表

程序在进行操作之前,先计算出来应该走哪个库

冷热分离

如果数据量再大,几亿的那种的时候,可以采取冷热分离的策略。

冷热分离(Hot-Cold Separation)是数据库优化中的一种策略,旨在通过将访问频率较低的数据(冷数据)和访问频率较高的数据(热数据)分开存储和管理,以提高数据库性能、降低成本,并优化查询效率。这种策略通常应用于大型数据库环境,其中数据集非常庞大且访问模式存在明显的变化。

  • 热数据是指经常被访问的数据,如最近的数据或常用的数据。
  • 冷数据则是相对不经常被访问的数据,比如历史数据或不常用的数据。

代码实现读写分离

mybatisPlus实现多数据源

多数据源 | MyBatis-Plus (baomidou.com)

1.引入dynamic-datasource-spring-boot-starter。

 

<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>${version}</version>
</dependency>

 2.配置数据源。

在yaml配置文件中配置,master 就是主数据库,slave_1就是一个从数据库,也就是一个项目引入了多个数据库

spring:datasource:dynamic:primary: master #设置默认的数据源或者数据源组,默认值即为masterstrict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源datasource:master:url: jdbc:mysql://xx.xx.xx.xx:3306/dynamicusername: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driver # 3.2.0开始支持SPI可省略此配置slave_1:url: jdbc:mysql://xx.xx.xx.xx:3307/dynamicusername: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driverslave_2:url: ENC(xxxxx) # 内置加密,使用请查看详细文档username: ENC(xxxxx)password: ENC(xxxxx)driver-class-name: com.mysql.jdbc.Driver#......省略#以上会配置一个默认库master,一个组slave下有两个子库slave_1,slave_2

 

使用 @DS 切换数据源。

 

例如:不用的mapper可以通过注解连接不同的数据库

一个mapper连接master数据库

对应这配置文件中的

datasource:master:

 

 

方法1:手动加注解(不推荐)

直接用mybatisPlus的这个注解

@DS 可以注解在方法上或类上,同时存在就近原则 方法上注解 优先于 类上注解。

我们就可以 让某个mapper里只有读操作给其加个注解,某个mapper里面只有增删改操作给其加个注解

或者直接查询方法上加注解走“查询库”,增删改的方法上加注解走“写库”

优点:

  1. 简单

缺点:

  1. 代码改动量太大了,很多地方都要加注解
  2. 用条件构造器的方法没办法指定

方法2:mybatis拦截器(不推荐)

通过拦截器来切换数据库,拦截所有的sql,出现insert、update、delete就走主库,出现select就走从库

优点:对代码侵入比较小

缺点:事务没办法保证

方法3:中间件

既能代码侵入小,又能保证事务,这样的最好

方案1:mycat

部署mycat,使用mycat进行数据源管理

MyCAT是一个强大的数据库中间件,不仅仅可以用作读写分离,以及分表分库、容灾管理,而且可以用于多租户应用开发、云平台基础设施,让你的架构具备很强的适应性和灵活性。

适用于有专门团队维护的大型企业,或者大团队。

太麻烦了,还得部署这里不推荐。

方案2:sharding-jdbc(推荐)

是一个类似mybatis的东西,我们可以不用部署其他中间件,也不需要改代码。

Sharding-JDBC定位为轻量Java框架,使用客户端直连数据库,以jar包形式提供服务,无proxy代理层,无需额外部署,无其他依赖,DBA也无需改变原有的运维方式。

Sharding-JDBC直接封装JDBC API,可以理解为增强版的JDBC驱动,旧代码迁移成本几乎为零。

适用于中小企业,或者中小团队。

具体的用sharding-jdbc 实现读写分离,请看下集讲解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/82476.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Prometheus+Grafana+AlertManager监控Linux主机状态

文章目录 PrometheusGrafanaAlertManager监控平台搭建开始监控Grafana连接Prometheus数据源导入Grafana模板监控Linux主机状态 同系列文章 PrometheusGrafanaAlertManager监控平台搭建 Docker搭建并配置Prometheus Docker拉取并配置Grafana Docker安装并配置Node-Exporter …

Python 密码破解指南:10~14

协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【OpenDocCN 饱和式翻译计划】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 收割 SB 的人会被 SB 们封神&#xff0c;试图唤醒 SB 的人是 SB 眼中的 SB。——SB 第三定律 十、加…

MongoDB Long 类型 shell 查询

场景 1、某数据ID为Long类型&#xff0c;JAVA 定义实体类 Id Long id 2、查询数据库&#xff0c;此数据存在 3、使用 shell 查询&#xff0c;查不到数据 4、JAVA代码查询Query.query 不受任何影响 分析 尝试解决&#xff08;一&#xff09; long 在 mongo中为 int64 类型…

Linux下的Shell基础——正则表达式入门(四)

前言&#xff1a; 正则表达式使用单个字符串来描述、匹配一系列符合某个语法规则的字符串。在很多文本编辑器里&#xff0c;正则表达式通常被用来检索、替换那些符合某个模式的文本。 在Linux 中&#xff0c;grep&#xff0c;sed&#xff0c;awk 等文本处理工具都支持…

R语言快速生成三线表(1)

R语言的优势在于批量处理&#xff0c;常使用到循环和函数&#xff0c;三线表是科研文章中必备的内容。利用函数实现自动判断数据类型和计算。使用R包&#xff08;table1&#xff09;。 # 创建连续性变量 continuous_var1 <- c(1.2, 2.5, 3.7, 4.8, 5.9) continuous_var2 &l…

【linux】2 make/Makefile和gitee

文章目录 一、Linux项目自动化构建工具-make/Makefile1.1 背景1.2 实例代码1.3 原理1.4 项目清理 二、linux下第一个小程序-进度条2.1 行缓冲区2.2 进度条 三、git以及gitee总结 ヾ(๑╹◡╹)&#xff89;" 人总要为过去的懒惰而付出代价ヾ(๑╹◡╹)&#xff89;" 一…

mybatis-plus--配置-(sql)日志输出-自动填充-分页-多数据源-逻辑删除

写在前面&#xff1a; 本文主要介绍mybatis-plus的配置&#xff0c;以后在有的时候在补充。欢迎交流。 文章目录 日志输出自动填充分页全局字段配置多数据源 日志输出 调试的时候需要看执行的sql&#xff0c;这时候就很需要日志来记录查看了。 mybatis-plus的日志配置在yml…

中国平台软件市场研究报告:OceanBase为金融行业国产分布式数据库销售额第一

近日&#xff0c;《2022-2023年度中国平台软件市场研究报告》&#xff08;以下简称“报告”&#xff09;发布&#xff0c;报告对包括数据库、操作系统等在内的平台软件市场发展进行了分析。报告指出&#xff0c;在对平台软件需求增长最快的金融行业&#xff0c;OceanBase已占据…

第7步---MySQL的视图操作和

第7步---MySQL的视图操作 虚拟表。保存的只是视图的定义。不存放真实的数据&#xff0c;数据还是在原先的表中。 好处是方便和简化代码以及安全。 1.视图创建 数据准备 -- 创建表的测试数据 create table dept(deptno int primary key,dname varchar(20),loc varchar(20) ); …

Leetcode---359周赛

题目列表 2828. 判别首字母缩略词 2829. k-avoiding 数组的最小总和 2830. 销售利润最大化 2831. 找出最长等值子数组 一、判断首字母缩略词 纯模拟&#xff0c;代码如下 class Solution { public:bool isAcronym(vector<string>& words, string s) {string tmp…

从头开始:将新项目上传至Git仓库的简易指南

无论您是一个经验丰富的开发者还是一个刚刚起步的新手&#xff0c;使用Git来管理您的项目是一个明智的选择。Git是一个强大的版本控制系统&#xff0c;它可以帮助您跟踪项目的变化、合并代码以及与团队成员协作。在本文中&#xff0c;我们将为您提供一步步的指南&#xff0c;教…

【Jetpack】Navigation 导航组件 ④ ( Fragment 跳转中使用 safe args 安全传递参数 )

文章目录 一、页面跳转间的传统的数据传递方式1、传统的数据传递方式 - Bundle 传递数据1、Navigation 组件中的 Bundle 数据传递2、传统数据传递实现步骤3、FragmentA 完整代码示例4、FragmentB 完整代码示例5、执行结果 2、使用 Bundle 传递数据安全性差 二、页面跳转间的传统…