降低数据库压力的方法

article/2025/7/9 0:28:07

1.合理增加索引
表索引可以加快对表中数据的检索速度,但是会降低表中数据的更新速度,所以增加表的索引一定控制在合理范围内,过多的索引不但不会降低数据库的压力,反而可能增大数据库的压力,表索引的建立一般要从具体业务场景出发,对于读多写少的场景,可以通过适当的增加索引来提高效率,对表的那些列建立索引?建立单独索引还是建立复合索引?要根据具体的业务场景来决定,建立索引之后可以针对索引对业务逻辑中使用的SQL进行优化,建立索引是最基础的手段,这里不错过多的介绍。

2.数据截转
一般情况下,业务中所处理的数据的都具有一定的时间间隔,所以可以通过对业务进行梳理,将当前时间间隔之外的数据进行截转,截转到历史数据库中,通过对业务进行拆分,当需要历史数据时,可以转到历史数据库中进行查询,或者修改,通过减少当前数据库的数据量,来减轻当前业务数据的压力。数据截转一般情况下是按照时间来进行,所以在业务员数据库设计的时候就要考虑到时间这个因素。
数据截转可以进行间隔一段时间做一次手工的数据截转,也可以启动一个定时器,每个一段时间进行一次数据截转,推荐的方式是准实时截转,及每天在业务量较小的时间,启动任务实时截转。
数据截转需要注意的几个问题:(1)外键关联关系(特别是有主键ID的关联的)注意在截转的历史数据库中的关联关系是否正确。(2)保证生产库和历史库的业务关联关系,从而避免历史库的数据需要关联生产库中的数据。

3.增加缓存
缓存是降低数据压力一个强有力的手段,基本是所有系统大型web系统中都会使用到,所以现代的大型web系统的架构一般如图。
现代web架构
请求1到达webserver之后,首先执行2访问缓存,如果hit则返回,miss则执行3访问数据库,在执行4同步到缓存中,再返回。但是不是缓存并不是万能的,缓存也有其使用的业务场景,一般在读多写少,数据重复查询比较集中的场景下,缓存可以大大提高性能,缓存操作顺序非常重要,不合理的操作顺序,在并发场景下常常会导致数据的不一致,缓存的具体操作可以参考缓存架构设计细节二三事这边文章。
在这里插入图片描述

4.生成宽表,冗余数据
有些业务例如报表、数据汇总等需要数据量较多,此时可能需要进行多表联合查询,联合查询操作非常消耗数据库的性能,所以在这种业务场景下为了避免过大的性能消耗,往往需要将查询时的多个表按照关联条件进行关联,生成一张含有冗余信息的包含所有表的多个字段的大宽表,这样在进行查询时,只在一张表中进行查询,性能明显得到提升。大宽表的生成是在业务流程中生成还是通过异步化任务来生成,根据具体的业务逻辑来定。

5.修改关系型数据库为非关系性数据库
非关系型数据库,也就是我们通常说的NoSQL数据,最常见就是key/value类型的数据库,这类数据库不强调表的关系,但是查询速度非常快,所在某些具体场景下,我们应该优先选择NoSQL数据库,例如字典信息表的查询。

6.读写分离
如果采用单点数据数据库,就算对数据进行上述的相关优化,但是由于其本身的单点性,所以随着流量的激增,数据库仍然会成为系统的瓶颈,如何对数据进行拆分来解决这个问题了,读写分离就是最常用的方法,读写分离的原理如下图。
读写分离
读写分离技术现在已经应用的很成熟,通过将数据拆分为两个实例,读写分离操作改善了数据单点的瓶颈,分摊了数据库压力,而且当主数据库宕机之后可以迅速的切换到从库,而不会导致业务不可用,同时也起到数据备份的作用,由于存在两个数据实例,所以数据怎么由主库同步到从库、主从之间延迟引发的数据不一致问题,以及怎么来分离业务中读和写操作成为要解决的问题成为要解决的问题。主从同步可以参考Mysql主从架构的复制原理及配置这篇文章,从主数据一致可以参考DB主从一致性的几种解决方法这篇文章。
在这里插入图片描述

7.数据库拆分
采用读写分离之后,数据库已经变为两份实例,数据库的压力已经得到分摊,如果数据库的压力还是过大时,这是就要从业务方面着手,将具体业务细分,将业务对应的表分拆到不同的数据库当中,如下图。
拆库
业务变动较大,同时要对系统内部之间的相互调用提供接口,调用方式可以选用RPC、Restful、JMQ消息等方式。一般情况下,数据库垂直拆分做的足够细分的话,加上读写分离技术,加上适当的数据截转就可以满足一般的大型业务系统对性能的需求。
在这里插入图片描述

8.表的垂直拆分
数据库可以进行垂直拆分,当然也可以对数据库中的表进行垂直拆分,对表进行拆分就是对数据拆分的再拆分,如图。种解决方法只适用于一些特定的场景,例如对表进行垂直拆分,通过异步化调用将所有任务异步化,前提是总的任务可以进行分布的异步化操作,在实际应用比较少,因为设计的表只要复合三范式的要求,一般是很难在进行拆分的,应用较多是对表进行水平拆分。
表的垂直拆分

9.表的水平拆分
如果已经做了数据库拆分,并且进行了读写分离,数据压力还是过大,主要原因就是数据库表中的记录太多,或者对数据进行了截转,但是对历史数据的操作还是比较频繁的,且随着截转的历史数据越来越多,历史数据库的压力也边的也变的越来越大,这时有两种解决方案:第一种方案就是对数据库中的表进行垂直拆分,从而不用在截转数据,通过不断对表进行水平拆分,保证数据数据库中单表的记录数保持在一个高性能合理的范围之类,通过扩容将不同分配到不同的数据中(分库分表)来保证数据库的压力,应用在访问时,通过分库分表的条件进行路由,就可以取到数据。第二种就是仍旧对数据进行截转,当历史数据信息过多从而导致数据库压力过大时,采用搜索引擎的方式来解决。相比于第一种操作第二种方案适用于读操作上,对与写操作,具有一定的局限性,第一种方案具有一定的通用性。对表进行水平拆分的过程如图所示。
水平拆分


http://chatgpt.dhexx.cn/article/2OJndJpA.shtml

相关文章

MyBatis—利用MyBatis查询(查询所有,查询一行,条件查询)

文章目录 1、查询所有2、查询详情(通过特定属性查询)3、多条件查询(1)接口参数列表三种表达方式(2)多条件查询(3)动态Sql(4)多条件动态查询(5&…

Redis实现分页和多条件模糊查询方案

导言 Redis是一个高效的内存数据库,它支持包括String、List、Set、SortedSet和Hash等数据类型的存储,在Redis中通常根据数据的key查询其value值,Redis没有模糊条件查询,在面对一些需要分页、排序以及条件查询的场景时(如评论&…

python操作es条件查询定制body

参考连接: python操作elasticsearch - 无量python - 博客园 1、切片查询 from elasticsearch import Elasticsearch# 建立连接 es Elasticsearch( hosts{192.168.0.120, 192.168.0.153}, # 地址timeout3600 # 超时时间 )# body指定查询条件 body {from: 0, #…

Oracle clob怎么存储超过4000长度的数据,你了解吗

目录 方式一、使用存储过程: 方式二、使用to_clob函数 方式三、mybatis中的方法 附: oracle将把varchar2字段(长度4000)改为clob类型 参考资料: 题记:我们知道Oracle存储的字段长度是有限制&#xff0…

oracle中clob和blob,Oracle中的BLOB和CLOB

非洲小白脸 阅读(364) 评论(0) 编辑 收藏 所属分类: oracle Oracle中的BLOB和CLOB 一、区别和定义 LONG: 可变长的字符串数据,最长2G,LONG具有VARCHAR2列的特性,可以存储长文本一个表中最多一个LONG列 LONG RAW: 可变长二进制数据,最长2G CLOB: 字符大对象Clob 用来存储单…

mysql clob blob_Oracle中 CLOB, BLOB和NLOB

SQL 类型 CLOB 在 Java TM 编程语言中的映射关系。SQL CLOB 是内置类型,它将 Character Large Object 存储为数据库表的某一行中的一个列。默认情况下,驱动程序使用 SQL locator(CLOB) 实现 Clob 对象,这意味着 CLOB 对象包含一个指向 SQL CL…

java clob 操作_Java Clob 操作

java操作数据库clob字段的简单例子: package com.test.db.clob; import java.io.BufferedReader; import java.io.IOException; import java.io.Writer; import java.sql.Clob; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepar…

ORACLE中CLOB介绍及使用

一、Oracle中的varchar2类型 我们在Oracle数据库存储的字符数据一般是用VARCHAR2。VARCHAR2既分PL/SQL Data Types中的变量类型,也分Oracle Database中的字段类型,不同场景的最大长度不同。 在Oracle Database中,VARCHAR2 字段类型&#xf…

clob类型(数据库clob类型)

如何获取clob类型的字节长度 blob和clob最大是多少?还是没有最大限制?它们的最大上限就是4G,Clob可以存储单字节字符数据,Blob可以存储无结构的二进制数据 Oracle中Clob类型如何处理? string id Guid。NewGuid()。ToS…

CRC校验方法的实现

1,确定收发双方所使用的校验位数(由收发双方自定义) 如1个字节的为CRC-8校验,2字节为CRC-16校验,4字节为CRC-32校验。 2,确定除数(生成多项式) 根据校验字节数,确定某个除数G(x),这个除数一般以二进制形式…

【Verilog】CRC校验码生成器原理及verilog实现

目录 一、CRC的基本原理 二、CRC生成步骤 2.1举个栗子 三、Verilog实现 四、参考资料 4.1 CRC在线计算器 一、CRC的基本原理 CRC :Cyclic Redundancy Check循环冗余校验码 将被处理的报文比特序列当做一个二进制多项式A(x)的系数,任意一个由二进制…

CRC校验原理及其使用

目录 何为CRC 为什么需要校验 为什么是CRC CRC的缺点 目录 何为CRC 为什么需要校验 为什么是CRC CRC的缺点 如何进行CRC校验 校验标准式是什么玩意? 常见的CRC校验 CRC校验计算过程 CRC校验代码参考 代码解读 生成CRC8校验表的代码 CRC检验网站 如何…

FPGA校验(2):CRC校验

CRC:输入序列对某个表达式求余数,或者认为一系列数据求异或的过程。 CRC校验 CRC原理 CRC实现非常简单,但想要真正掌握CRC算法原理,就必须清楚地了解有限域的运算规则,知道CRC就是有限域中的除法余数,并且清楚如何将串…

crc校验c语言程序,C语言:CRC校验

一、CRC码 CRC:Cylic Reduancy check译作汉语就是循环冗余校验码。 二、XOR XOR:逻辑运算符异或,不知道用符号怎么写,总之其运算法则是,不同为1,相同为0。 三、用XOR代替算术运算上除法的两个例子。 1、10110010000/11001 第一次异或(相除),得到商为1,余数为1111,加入…

【Verilog】CRC 校验(二)用 Verilog 实现生成 CRC 校验码

目录 实验任务 CRC 生成 Verilog 实现 电路生成原理 模块设计图 CRC 生成时序图 具体代码实现 上板验证 实验任务 在上一篇介绍了 CRC 校验码的原理,如何计算 CRC 校验码,这篇介绍如何利用 Verilog 实现CRC 校验码的生成。 什么是 CRC 校验码&a…

CRC校验 - 基于FPGA的实现

CRC校验 - 基于FPGA的实现 0 背景 CRC即循环冗余校验:常用于数据通信领域中,通常由发送端添加校验码于单帧数据的尾部,并由接受方进行提取和校验该帧数据传输是否正确。 循环冗余检查(CRC)是一种数据传输检错功能&am…

CRC校验的原理及实现方法

一、CRC校验介绍 循环冗余校验码(CRC),是一种常用的、具有检错、纠错能力的校验码,在早期的通信中运用广泛。循环冗余校验码常用于外存储器和计算机同步通信的数据校验。循环冗余校验是通过某种数学运算来建立数据位和校验位的约定…

C#编程,CRC校验原理

1.CRC简介 CRC全称循环冗余校验(Cyclic Redundancy Check, CRC),是通信领域数据传输技术中常用的检错方法,用于保证数据传输的可靠性。网上有关这方面的博客和资料很多,本文尽量简洁的梳理一下它的原理。后面还会结合自己的实践经…

LabVIEW实现CRC校验

目录 1、内部控件计算CRC校验 2、公式节点计算CRC校验 CRC(循环冗余校验),是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除…

CRC校验及C语言实现

摘自:CRC校验原理及其C语言实现 地址:https://blog.csdn.net/whik1194/article/details/108837493?spm1001.2014.3001.5502 目录 什么是校验算法CRC算法简介CRC参数模型CRC计算CRC校验CRC计算的C语言实现CRC计算工具总结 什么是校验算法 最近的工作中&…