MySQL架构优化及SQL优化

变更项目的整体架构是性能收益最大的方式。主要涉及两方面,一方面是从整个项目角度,引入一些中间件优化整体性能,另一方面是调整MySQL的部署架构,确保能承载更大的流量访问,提高数据层的整体吞吐。

1. 引入缓存中间件解决读压力

正常的项目业务中,读请求的数量远超写请求,所有的读请求都落入数据库处理,对MySQL会造成巨大的访问压力,甚至会由于流量过大,直接将数据库打到宕机,通常都会在应用程序和数据库之间架设一个缓存来解决这个问题,例如最常用的Redis。

在缓存Key设计合理的情况下,至少能够为MySQL分担70%以上的读压力,查询MySQL之前先查询一次Redis,Redis中有缓存数据则直接返回,没有数据时再将请求交给MySQL处理,从MySQL查询到数据后,再次将数据写入Redis,后续有相同请求再来读取数据时,直接从Redis返回数据即可。

2. 引入消息中间件解决写压力

项目中存在写操作比较频繁的时候,通过引入MQ消息中间件做削峰填谷。项目中核心的业务直接到MySQL执行落库操作,一些不重要的操作先发往MQ,MQ写入成功后直接将结果返回,后续在由消费线程去执行。

3. MySQL主从读写分离

当经过Redis、MQ后,必须要走MySQL执行的请求还是超出单机MySQL的承载范围,并且MySQL就是以单机的形式在线上运行,会出现频繁宕机的情况。

有三种MySQL架构的优化方案:主从架构,双主架构、分库分表架构。

主从复制,大多数中间件都会存在的一种高可用机制,MySQL中也存在这种架构,使用两台服务器来部署两个MySQL节点,一台为主机,另一台为从机,从节点会一直不断的从主节点上同步增量数据,当主节点发生故障时,从节点可以替换原本的主节点,以此来为客户端提供正常服务,

从节点仅作为一个备胎,难免有些浪费资源,可以在主从架构的模式下,略微做些调整,即实现读写分离,由于读操作并不会变更数据,对于读请求可以分发到从节点上处理,会引发数据变更的写请求,则分发到主节点处理,这样从而能够进一步提升MySQL的整体性能。

主节点的数据变更后,从节点也会基于bin-log日志去同步数据,但这种模式下会存在些许的数据不一致性,同步是需要时间的,向主节点修改一条数据后,立马去从节点中查询,这时不一定能够看到最新的数据,因为这时数据也许还未被同步过来。并没有太好的办法解决,项目对数据的实时性特别高就不要考虑主从架构。

4. MySQL双主双写热备

读写分离更适用于读大于写的业务。写大于读的业务从机分担的仅是系统的10~20%流量,所以双主双写(双柱热备)是最佳的选择。

两个MySQL节点都是主,同时都为从,两者之间相互同步数据,同时具备处理读/写请求的能力,出现读/写操作时,可由任意一个节点处理。

对于每张表的主键要处理好,如果表的主键是int自增类型的,要手动设置一下自增步长和起始值,比如这里有两个MySQL节点,将步长设置为2,起始值分别为1、2,能够确保主键的唯一性,设置后两个节点自增ID的序列如下:

    • 节点1:[1、3、5、7、9、11、13、15、17、19.....]
    • 节点2:[2、4、6、8、10、12、14、16、18、20.....]

当插入数据的SQL语句发往节点1时,会按照奇数序列自增ID,发往节点2时会以偶数序列自增ID,双方相互同步数据,最终两个MySQL节点都会具备完整的数据,因此后续的读请求,无论发往哪个节点都可以读到数据。

多主模式中的每个节点都会存储完整的数据,当数据增长达到硬件的最大容量时,就无法继续写入数据了,只能通过加大磁盘的形式进一步提高存储容量,但硬件也不可能无限制的加下去,而且由于多主是基于主从架构实现的,因为具备木桶效应,要加得所有节点一起加,否则另一个节点无法同步写入数据时,就会造成所有节点无法写入数据。

5. MySQL分库分表思想

根据业务属性的不同创建不同的数据库,不同的业务连接不同的数据库,各自之间数据分开存储,节点之间数据不会同步,以这种方式来部署MySQL,即提高了数据库的整体吞吐量和并发能力,同时也不存在之前的存储容量的木桶问题。实际上对项目做了分库分表之后,带来的问题、要解决的问题只会更多,只不过相较于分库分表带来的收益而言,解决问题的成本是值得的,所以才会使用分库分表技术。

 参考文档:MySQL调优篇:单机数据库如何在高并发场景下健步如飞?

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

语义分割和实例分割区别?

语义分割:将图像中的每个像素分配给其对应的语义类别,其主要针对于像素,或者说它是像素级别的图像分割方法。:语义分割的目的是为了从像素级别理解图像的内容,并为图像中的每个像素分配一个对象类。 实例分割&#xf…

泛微E9开发 控制Radio框字段打印是否仅显示选中项文字

控制Radio框字段打印是否仅显示选中项文字 1、需求说明2、实现方法3、扩展知识点控制Radio框字段打印是否仅显示选中项文字格式参数说明样例 1、需求说明 当我们对单选框进行打印时,往往会把所有的选项一起打印出来(如下图所示),现…

【1】A-Frame整体介绍

1.A-Frame是什么? A-Frame 是一个用于构建虚拟现实 (VR) 体验的 Web 框架。 A-Frame 基于 HTML 之上,因此上手简单。但 A-Frame 不仅仅是 3D 场景图或标记语言;它还是一种标记语言。其核心是一个强大的实体组件框架,为 Three.js …

昇思MindSpore学习入门-模型模块自定义

基础用法示例 神经网络模型由各种层(Layer)构成,MindSpore提供构造神经网络层的基础单元Cell,基于Cell进行神经网络封装。下面使用Cell构造经典模型AlexNet。 如图所示,AlexNet由5个卷积层与3个全连接层串联构成,我们使用mindspo…

秋招Java后端开发冲刺——并发篇2(ThreadLocal、Future接口)

本文对ThreadLocal类和Future接口进行了总结概括,包括ThreadLocal类的原理、内存泄露等问题,和Future接口的使用等问题。 一、ThreadLocal 1. 介绍 ThreadLocal(线程局部变量)是Java中的一个类,线程通过维护一个本地…

探索安卓四大组件:活动、服务、广播接收器和内容提供者

🍎个人博客:个人主页 🏆个人专栏:Android ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 1. Activity(活动) 概述: 生命周期: 使用方法: 2. Service&…

简过网:2024年一级造价工程师正在报名中,看看你有报考资格吗?

计划报考2024一级造价工程师的小伙伴要注意了,现在一造报名正在启动中,想考试的小伙伴一定要看清楚这些报考条件和考试内容哦,今天,小编和大家一块来分享一下,希望对你有帮助。 几个简单的问题,让你彻底了解…

2024年信息系统项目管理师1批次上午客观题参考答案及解析(3)

51、探索各种选项,权衡包括时间与成本、质量与成本、风险与进度、进度与质量等多种因素,在整个过程中,舍弃无效或次优的替代方案,这种不确定性应对方法是()。 A.集合设计 B.坚韧性 C.多种结果…

alibabacloud学习笔记11

讲解什么是配置中心及使用前后的好处 讲解Nacos作为配置中心面板介绍 官方文档 Nacos config alibaba/spring-cloud-alibaba Wiki GitHub 加入依赖: 订单服务和视频服务也加上这个依赖。 讲解Nacos作为配置中心实战 订单服务添加配置。 我们注释掉之前的配置。 …

idea如何连接gitee仓库

1.先在idea上登录gitee账号 在gitee官网上生成令牌。 点击生成新令牌。 复制到idea上就行了。然后登陆成功。 2.连接gitee 把项目的https克隆到idea中就行了。

Joblib 是一个专注于高效计算和数据持久化的 Python 库

目录 01Joblib 是什么? 为什么选择 Joblib? 安装与配置 02Joblib 的基本用法 并行计算 数据持久化 03实战案例 项目简介 项目结构 依赖安装 应用代码 运行应用 …

javascript高级部分笔记

javascript高级部分 Function方法 与 函数式编程 call 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象。 说明:call 方法可以用来代替另一个对象调用一个方法。cal…

RT2-使用NLP的方式去训练机器人控制器

目标 研究在网络数据上训练的视觉语言模型也可以直接结合到端到端的机器人控制中,提升泛化性以及获得突出的语义推理;使得单个的端到端训练模型可以同时学习从机器人观测到动作的映射,这个过程可以受益于基于网络上的语言和视觉语言数据的预训…

HumanoidBench——模拟仿人机器人算法有未来

概述 论文地址:https://arxiv.org/pdf/2403.10506 仿人机器人具有类似人类的外形,有望在各种环境和任务中为人类提供支持。然而,昂贵且易碎的硬件是这项研究面临的挑战。因此,本研究开发了使用先进模拟技术的 HumanoidBench。该基…

【工具分享】零零信安——攻击面管理平台

文章目录 00SEC-ASM™功能介绍功能演示 最近闲来无事,到处网上冲浪,无意间发现了长亭云图攻击面管理平台,无奈需要授权才能使用,于是就找到了平替:零零信安攻击面管理平台。 长亭云图攻击面管理平台:https:…

Spring Boot集成grpc快速入门demo

1.什么是GRPC? gRPC 是一个高性能、开源、通用的RPC框架,由Google推出,基于HTTP2协议标准设计开发,默认采用Protocol Buffers数据序列化协议,支持多种开发语言。gRPC提供了一种简单的方法来精确的定义服务&#xff0c…

Spark SQL中的正则表达式应用

正则表达式是一种强大的文本处理工具,在Spark SQL中也得到了广泛支持。本文将介绍Spark SQL中使用正则表达式的主要方法和常见场景。 目录 1. 正则表达式函数1.1 regexp_extract1.2 regexp_replace1.3 regexp_like 2. 在WHERE子句中使用正则表达式3. 在GROUP BY中使用正则表达…

线程池案例

秒杀 需求 10个礼物20个客户抢随机10个客户获取礼物&#xff0c;另外10无法获取礼物 任务类 记得给共享资源加锁 public class MyTask implements Runnable{// 礼物列表private ArrayList<String> gifts ;// 用户名private String username;public MyTask( String user…

2024 WAIC|第四范式签约上海徐汇 加速推动“人工智能+千行百业”

7月5日&#xff0c;在“加速‘人工智能’构筑新质生产力”活动上&#xff0c;上海市徐汇区与作为大模型开发应用的核心企业第四范式举行签约仪式。徐汇区委常委、副区长俞林伟&#xff0c;第四范式联合创始人、总裁胡时伟等代表上台签约。 未来&#xff0c;双方将围绕人工智能前…