MySQL架构优化及SQL优化

news2025/1/12 10:09:58

变更项目的整体架构是性能收益最大的方式。主要涉及两方面,一方面是从整个项目角度,引入一些中间件优化整体性能,另一方面是调整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.coloradmin.cn/o/1911782.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用F1C200S从零制作掌机之USB游戏手柄

一、USB手柄 COIORVIS PC游戏手柄电脑USB FC模拟器经典游戏手柄 安卓手机有线连接单打格斗对打拳皇 经典有线手柄【黄色】 https://item.jd.com/10046453175183.html 插入USB即可自动识别。 # [ 1425.447643] usb 1-1: USB disconnect, device number 7 [ 1427.072155] usb …

方法引用 异常 file

目录 一.方法引用 1.方法引用概述 2.引用静态方法 3.引用成员方法 i.引用其他成员方法 ii.引用本类成员方法 iii.引用父类成员方法 4.引用构造方法 5.其他调用方式 i.使用类名引用成员方法 ii.引用数组的构造方法 二、异常 1.异常的作用 2.异常的处理方式 i.JVM…

Windows7彻底卸载mysql

1.控制面板卸载mysql 2.删除C:\Program Files\MySQL 3.删除C:\用户\Administrator\App Data\Roaming\MySQL”(App Data默认隐藏,需要在文件夹和搜索选项中勾选显示文件夹),为了删除的更彻底,可以直接在计算机全盘搜索MySQL关键字,将所有找到…

微信服务里底部的不常用功能如何优化的数据分析思路

图片.png 昨天下午茶时光,和闺蜜偶然聊起,其实在微信服务底部,有很多被我们忽略遗忘,很少点过用过的功能服务,往往进入服务只为了收付款或进入钱包,用完就走了,很少拉到底部,看到和用…

STM32的SPI接口详解

目录 1.SPI简介 2.SPI工作原理 3.SPI时序 3.1 CPOL(Clock Polarity,时钟极性): 3.2 CPHA(Clock Phase,时钟相位): 3.3 四种工作模式 4.相关代码 4.1使能片选信号 4.2使能通…

【WebGIS平台】传统聚落建筑科普数字化建模平台

基于上述概括出建筑单体的特征部件,本文利用互联网、三维建模和地理信息等技术设计了基于浏览器/服务器(B/S)的传统聚落建筑科普数字化平台。该平台不仅实现了对传统聚落建筑风貌从基础到复杂的数字化再现,允许用户轻松在线构建从…

谷粒商城-个人笔记(集群部署篇三)

前言 ​学习视频:​Java项目《谷粒商城》架构师级Java项目实战,对标阿里P6-P7,全网最强​学习文档: 谷粒商城-个人笔记(基础篇一)谷粒商城-个人笔记(基础篇二)谷粒商城-个人笔记(基础篇三)谷粒商城-个人笔记(高级篇一)谷粒商城-个…

Spark实现电商消费者画像案例

作者/朱季谦 故事得从这一张图开始说起—— 可怜的打工人准备下班时,突然收到领导发来的一份电商消费者样本数据,数据内容是这样的—— 消费者姓名|年龄|性别|薪资|消费偏好|消费领域&#x…

Sentinel-1 Level 1数据处理的详细算法定义(二)

《Sentinel-1 Level 1数据处理的详细算法定义》文档定义和描述了Sentinel-1实现的Level 1处理算法和方程,以便生成Level 1产品。这些算法适用于Sentinel-1的Stripmap、Interferometric Wide-swath (IW)、Extra-wide-swath (EW)和Wave模式。 今天介绍的内容如下&…

【1.3】动态规划-解码方法

一、题目 一条包含字母A-Z的消息通过以下映射进行了编码: A -> 1 B -> 2 ... Z -> 26 要解码已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母&…

Nacos2.X 配置中心源码分析:客户端如何拉取配置、服务端配置发布客户端监听机制

文章目录 Nacos配置中心源码总流程图NacosClient源码分析获取配置注册监听器 NacosServer源码分析配置dump配置发布 Nacos配置中心源码 总流程图 Nacos2.1.0源码分析在线流程图 源码的版本为2.1.0 ,并在配置了下面两个启动参数,一个表示单机启动&#…

C++初探究(2)

引用 对于一个常量,想要将其进行引用,则使用普通的引用相当于权限扩大(常量为只读,但此处的引用参数为可读可写),C编译器会报错. 例如: const int a 10;int& ra a;//权限放大&#xff0…

使用Mplayer实现MP3功能

核心功能 1. 界面设计 项目首先定义了一个clearscreen函数,用于清空屏幕,为用户界面的更新提供了便利。yemian函数负责显示主菜单界面,提供了包括查看播放列表、播放控制、播放模式选择等在内的9个选项。 2. 文件格式支持 is_supported_f…

详解TCP和UDP通信协议

目录 OSI的七层模型的主要功能 tcp是什么 TCP三次握手 为什么需要三次握手,两次握手不行吗 TCP四次挥手 挥手会什么需要四次 什么是TCP粘包问题?发生的原因 原因 解决方案 UDP是什么 TCP和UDP的区别 网络层常见协议 利用socket进行tcp传输代…

淮北在选择SCADA系统时,哪些因素会影响其稳定性?

关键字:LP-SCADA系统, 传感器可视化, 设备可视化, 独立SPC系统, 智能仪表系统,SPC可视化,独立SPC系统 在选择SCADA系统时,稳定性是一个关键因素,因为它直接影响到生产过程的连续性和安全性。以下是一些影响SCADA系统稳定性的因素: 硬件质量…

如何在 CentOS 上配置本地 YUM 源

引言 CentOS 作为一个流行的企业级 Linux 发行版,依赖 YUM(Yellowdog Updater, Modified)来管理软件包。YUM 源(Repository)是软件包存储和分发的中心,它们通常位于互联网上。然而,在某些情况下…

使用clion刷leetcode

如何优雅的使用clion刷leetcode 安装插件:LeetCode Editor) 插件配置: 这样我们每打开一个项目,就会创建类似的文件 我们的项目结构: 我们在题解文件中导入头文件myHeader.h并将新建的文件添加到cmakelists.txt文件,…

数据结构双向循环链表

主程序 #include "fun.h" int main(int argc, const char *argv[]) { double_p Hcreate_head(); insert_head(H,10); insert_head(H,20); insert_head(H,30); insert_head(H,40); insert_tail(H,50); show_link(H); del_tail(H); …

c++内存管理(上)

目录 引入 分析 说明 C语言中动态内存管理方式 C内存管理方式 new/delete操作内置类型 new和delete操作自定义类型 引入 我们先来看下面的一段代码和相关问题 int globalVar 1; static int staticGlobalVar 1; void Test() { static int staticVar 1; int localVar 1…

影视行业的人工智能与-【机器学习】:案例分析

欢迎关注小知:知孤云出岫 目录 引言AI和ML在影视行业的当前应用AI和ML对影视行业的未来影响案例研究:AI生成动画视频目标工具和库数据收集模型训练视频生成 结论参考文献 引言 人工智能(AI)和机器学习(ML&#xff09…