【架构-14】数据库性能优化方式

news2024/11/25 6:51:44

数据库出现性能瓶颈对外的表现为:

  1. 大量请求阻塞
  2. SQL操作变慢
  3. 存储出现问题
    为解决上述出现的问题,因此推出了一系列的数据库性能优化方式。
    数据库性能优化是提高数据库系统性能和响应时间的关键任务。以下是一些常见的

数据库性能优化方式:

索引优化:
通过创建合适的索引,可以加快查询操作的速度。索引可以加速数据的查找和过滤,减少磁盘I/O操作。需要根据查询的频率、字段选择性以及数据访问模式等因素来设计和优化索引。

查询优化:
优化查询语句可以提高数据库的性能。使用合适的查询语句、避免不必要的连接和子查询、限制返回的数据量、优化WHERE和JOIN条件等都可以改善查询性能。

数据库设计和规范化:
良好的数据库设计和规范化可以提高数据库的性能和可维护性。合理划分表和字段、避免冗余数据、正确选择数据类型和长度等都是优化数据库设计的关键。

配置调优:
优化数据库的配置参数可以提高数据库的性能。例如,调整数据库缓冲区大小、并发连接数、日志记录级别等参数,以适应不同的工作负载和硬件环境。

硬件优化:
合理配置和优化硬件设备可以改善数据库性能。包括增加内存容量、优化磁盘子系统、使用RAID技术提高磁盘性能、使用高速网络等。

缓存优化:
使用缓存技术可以减少数据库的访问次数,提高响应速度。常见的缓存技术包括数据库查询缓存、应用级缓存、分布式缓存等。

分区和分片:
对于大规模数据量和高并发访问的场景,可以使用分区和分片技术来分散负载、提高吞吐量和扩展性。

SQL优化工具和性能监控:
使用专业的SQL优化工具和性能监控工具可以帮助识别慢查询、锁竞争、瓶颈等问题,并提供相应的优化建议和性能指标。

数据库版本升级和补丁更新:
及时升级数据库版本和应用相关的补丁可以获得性能改进和Bug修复,提高数据库的稳定性和性能。

数据库分布和负载均衡:
将数据库分布在多个物理节点上,并使用负载均衡技术将请求均匀分发到不同节点,可以提高系统的可用性和扩展性。

下面详细介绍几类技术:

分库和分表

在数据库优化中,分库(Sharding)和分表(Partitioning)是两种常见的策略,用于解决大规模数据量和高并发访问的问题。

  1. 分库(分片)
    分库是将数据库按照一定规则将数据划分为多个独立的数据库实例,每个数据库实例可以部署在不同的物理服务器或节点上。每个数据库实例负责处理一部分数据。
    分库的目的是将数据分散存储在不同的数据库中,以减轻单个数据库的负载压力,并提高系统的并发处理能力和扩展性。通常,分库的规则是基于数据的某个属性或哈希函数计算的结果来确定数据应该存储在哪个数据库实例中。
    分库也带来了如数据一致性、跨库事务、扩展性的管理等挑战。
    在这里插入图片描述
    在这里插入图片描述

  2. 分表
    分表是将单个表按照一定的规则拆分为多个子表,每个子表存储部分数据。
    分表的目的是将大表拆成小表,以减少单个表的数据量,提高查询性能和维护的效率。
    分表也会增加数据管理的复杂性。
    在这里插入图片描述

分库和分表通常结合使用,以更好地处理海量数据和高并发访问的需求。它们是数据库优化中常见手段,可以提高系统的性能、可扩展性和可用性。

反规范化设计

优点:避免进行表之间的连接操作,可以提高数据操作的性能能够,减少数据库查询时SQL的连接次数,从而减少磁盘IO,提高查询效率。
缺点:数据的重复存储浪费了磁盘空间,会产生数据的不一致问题
在这里插入图片描述

1、反规范化设计中,解决数据不一致问题的三种常见方法,有批处理维护、应用逻辑和触发器。
(1)异步通信和事件驱动:使用异步通信和事件驱动的方式来处理数据的更新和同步。当数据发生变化时,通过异步消息队列或事件总线发布相应的事件,然后由订阅者异步处理和更新相关的数据。这种方式可以降低数据更新的延迟和冲突。
(2)定期数据清理和维护(批处理维护):定期对数据进行清理和维护是确保数据一致性的重要步骤。这包括删除过期或无效的数据,修复错误数据,更新数据索引等操作,以保持数据的一致性和可靠性。通过定期运行一批处理作业或存储过程对数据库进行修改,适用于对实时性要求不高的情况。
(3)触发器:对数据的任何修改立即触发对数据库某些列的相应修改。触发器实时性好,也易于维护。

布隆过滤器(查询优化)

布隆过滤器是一种概率型数据结构,用于判断一个元素是否属于一个集合,以及过滤掉不属于集合的元素。它通过使用位数组和多个哈希函数来实现。
在这里插入图片描述

布隆过滤器本质是一种数据结构,特点是高效地插入和查询。原理是当某个元素加入集合时,通过散列函数将这个元素映射成一个位数组中的K个点,检索时只要看看这些点是不是都是1就大概知道集合中有没有它了,如果这些点有任何一个0,则被检元素一定不在,如果都是1,被检元素可能在。
主要解决的问题是在大规模数据集中快速判断某个元素是否存在,同时具有高效的空间利用率。布隆过滤器适用于那些对查询速度要求较高,而对少量的误判能够容忍的场景。
然而,布隆过滤器也存在一定的缺点。它有一定的误判率,即可能将不属于集合的元素误判为属于集合。此外,无法删除已插入的元素,因为删除操作会影响其他元素的判断结果。

一致性哈希算法(数据分布和负载均衡)

一致性哈希算法是一种用于分布式系统中数据分片和负载均衡的算法。哈希算法是通过某种哈希算法散列得到一个值,将该值分配到集群响应节点进行缓存。
一致性哈希算法是一种特殊的哈希算法,它将整个哈希空间映射成一个按顺时针方向组织的虚拟圆环,使用哈希算法算出数据的哈希值,然后根据哈希值的位置顺时针查找,将数据分配到第一个遇到的集群节点进行缓存,解决了简单哈希算法在分布式哈希表中存在的动态伸缩问题。
主要解决的问题是在分布式系统中动态添加或删除节点时,如何保持数据的均衡分步和最小的数据迁移的操作。一致性哈希算法通过在环空间上均匀分步节点,使相邻节点负责的数据范围最小,从而减少数据迁移的开销。
一致性哈希算法的优点在于它在节点增减时能够保持负载均衡,适用于分布式缓存、负载均衡、分布式存储等场景。

Redis持久化(缓存优化)

为什么要持久化(答:Redis的数据全部存储在内存中,如果突然宕机,数据就会全部丢失,因此必须有一套机制来保证Redis的数据不会以为故障而丢失)
持久化方法
在这里插入图片描述

Redis持久化技术有RDB内存快照(全集)、AOF日志(快速)两种。RDB内存快照方式就是把当前内存中的数据集快照写入磁盘(数据库中所有键值对数据)。恢复时是将快照文件直接读到内存里。AOF是通过持续不断地保存Redis服务器所执行的更新命令来记录数据库状态,类似mysql的binlog。恢复数据时需要从头开始回放更新命令。
用AOF来保证数据不丢失,作为数据恢复的第一选择;用RDB来做不同程度的冷备,在AOF文件都丢失或损坏不可用时,还可以使用RDB来进行快速的数据恢复。
缓存问题:
本质:别让数据库去抗所有流量
缓存穿透:大量的key在redis里是不存在的
缓存雪崩:大量的key是已存在的,但同时失效了
缓存击穿:少量热点的key缓存时间失效了
解决方案:采用cluster集群(分片或主从复制和哨兵模式、读写分离、分库分表)、服务降级、服务熔断、请求限流。

主从复制

优势:(1)避免数据库单点故障、提高可用性。主服务器实时、异步复制数据到从服务器,当主数据宕机时,可从数据库中选择一个升级为主服务器,防止数据库单点故障。
(2)提高查询效率,主数据库可进行数据的插入、删除等写操作,而从数据库专门用来进行数据的查询操作,将不同操作分担到不同服务器以提高数据库访问效率。
主从复制的三种模式
(1)全同步复制,是指主库在执行完一个事务后,会等待所有从库执行完该事务后,才会把结果返回到客户端。这种方式的优点是数据一致性较高,但性能比较低。
(2)异步复制,主库在执行完客户端提交的事务后,会立即将结果返回给客户端。不关心从库是否已经接收并处理。
(3)半同步复制,主库在执行完客户端提交的事务后,会等待至少一个从库接收到后,才会将结果返回到客户端。牺牲了一定的性能,提高了数据的安全性。
主从复制的工作流程如下:
(1)主节点接收到写操作后,会将写操作记录成二进制日志(Binary Log)并持久化存储。
(2)从节点连接到主节点,并请求同步二进制日志。主节点将二进制日志发送给从节点。
(3)从节点将接收到的二进制日志应用到自己的数据库中,使其与主节点保持一致。
(4)当客户端发起读操作时,可以选择连接主节点或从节点。从节点负责处理读操作,从而减轻主节点的负载。

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

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

相关文章

在Qt中如何简单设计一个文件和图像浏览器

文本浏览器 设计一个文本浏览器程序,可以打开、显示 txt、html等文件。 1.在Qt Designer中设计一个菜单其中包含打开和退出选项: 2. 在 QMainWindow 构造函数中把 textBrower 设为主窗口的中心部件,这样整个窗口就成了包含 textBrower 的单文…

免费的 ChatGPT、GPTs、AI绘画(国内版)

🔥博客主页:白云如幻❤️感谢大家点赞👍收藏⭐评论✍️ ChatGPT3.5、GPT4.0、GPTs、AI绘画相信对大家应该不感到陌生吧?简单来说,GPT-4技术比之前的GPT-3.5相对来说更加智能,会根据用户的要求生成多种内容甚…

Elasticsearch的使用教程

Elasticsearch简介 Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。作为 Elastic Stack 的核心,Elasticsearch 会集中存储您的数据,让您飞快完成搜索,微调相关性,进行…

【读论文】【泛读】三篇生成式自动驾驶场景生成: Bevstreet, DisCoScene, BerfScene

文章目录 1. Street-View Image Generation from a Bird’s-Eye View Layout1.1 Problem introduction1.2 Why1.3 How1.4 My takeaway 2. DisCoScene: Spatially Disentangled Generative Radiance Fields for Controllable 3D-aware Scene Synthesis2.1 What2.2 Why2.3 How2.4…

hadoop编程之工资序列化排序

数据集展示 7369SMITHCLERK79021980/12/17800207499ALLENSALESMAN76981981/2/201600300307521WARDSALESMAN76981981/2/221250500307566JONESMANAGER78391981/4/22975207654MARTINSALESMAN76981981/9/2812501400307698BLAKEMANAGER78391981/5/12850307782CLARKMANAGER78391981/…

【Image captioning】论文阅读九—Self-Distillation for Few-Shot Image Captioning_2022

摘要 大规模图像字幕数据集的开发成本高昂,而大量未配对的图像和文本语料库可能有助于减少手动注释的工作。在本文中,我们研究了只需要少量带注释的图像标题对的少样本图像标题问题。我们提出了一种基于集成的自蒸馏方法,允许使用不成对的图像和字幕来训练图像字幕模型。该…

Flask Web 应用与 MongoDB 集成:用户登录和退出

在本文中,我们将探讨如何使用 Flask Web 框架和 MongoDB 数据库构建一个简单的 Web 应用。我们将使用 Flask-PyMongo 扩展来实现 MongoDB 集成,并使用 Flask-Login 扩展来处理用户认证。 1. 安装所需库 首先,我们需要安装 Flask、Flask-PyM…

如何利用纯前端技术,实现一个网页版视频编辑器?

纯网页版视频编辑器 一、前言二、功能实现三、所需技术四、部分功能实现4.1 素材预设4.2 多轨道剪辑 一、前言 介绍:本篇文章打算利用纯前端的技术,来实现一个网页版的视频编辑器。为什么突然想做一个这么项目来呢,主要是最近一直在利用手机…

初识数据库与数据库管理系统

实体的概念与数据库 实体(对象): 客观存在的事物都是实体实体数据的存储要求: 必须按照一定的分类和规律存储数据库: 专门用于存储这些实体的信息的数据集合数据库的特点: 海量存储数据/数据检索非常方便保持数据信息的一致/完整/并实现数据…

C# .NET 中的反应式系统

概述:反应式系统已成为构建健壮、可扩展和响应迅速的应用程序的强大范式。这些系统被设计为更具弹性、弹性和消息驱动性,确保它们在各种条件下保持响应,包括高负载、网络延迟和故障。在本文中,我们将探讨 .NET 生态系统中反应式系…

Day 15 Linux网络管理

IP解析 IP地址组成:IP地址由4部分数字组成,每部分数字对应于8位二进制数字,各部分之间用小数点分开,这是点分2进制。如果换算为10进制我们称为点分10进制。 每个ip地址由两部分组成网络地址(NetID)和主机地址(HostID).网络地址表…

DataGrip数据库管理工具安装使用

DataGrip数据库管理工具安装使用 DataGrip介绍 DataGrip是jetbrains旗下的一款数据库管理工具,相信做过java开发的同学都知道,idea就是这家公司发明的。 DataGrip 是JetBrains公司开发的数据库管理客户端工具(操作数据库的IDE,…

看图找LOGO,基于YOLOv8全系列【n/s/m/l/x】参数模型开发构建生活场景下的商品商标LOGO检测识别系统

日常生活中,我们会看到眼花缭乱的各种各样的产品logo,但是往往却未必能认全,正因为有这个想法,这里我花费了过去近两周的时间采集和构建了包含50种商品商标logo的数据集,基于YOLOv8全系列的参数模型开发构建了对应的检…

初识--Linux的虚拟地址空间

重新了解地址空间 在学习c/c语言的时候,大家一定见过以下这张图 说的是程序会加载在如图的结构上,实际上,我们真的对他很了解吗,而在Linux进程控制这,就会有一个奇怪的现象 前提提要:简要介绍一下fork函数 进程内核数据结构(PCB)自己的代码以及数据 在Linux中,fork可以从当…

什么是邮箱分身?如何快速创建30个邮箱分身?

很多人只知道微信、QQ等应用分身,对于邮箱分身并不是很了解。邮箱分身和他们的不同点在于我们直接在原有邮箱的基础上创立新的虚拟邮箱地址,并且密码一致,在我们需要运营多个社交媒体账号或者管理多个项目的情况下,邮箱分身是一个…

盲盒小程序成为收益“法宝”?盲盒线上如何发展

近年来,盲盒在年轻人中掀起了一股潮玩热风,受到了不少年轻人的青睐,盲盒商品更是在不断创新中,收藏价值逐渐提高。随着市场规模的扩大,越来越多的玩家和商家涌入到了市场中,盲盒的商业模式正在加快发展中。…

人工智能与IP代理池:解析网络数据采集的未来

前言 随着互联网的快速发展,数据成为了当今社会最宝贵的资源之一。然而,要获取大量的网络数据并进行有效的分析,往往需要面对诸多挑战,其中之一就是网络封锁与反爬虫机制。在这个背景下,人工智能(AI&#x…

【CANN训练营】目标检测(YoloV5s)实践(Python实现)

样例介绍 使用多路离线视频流(* .mp4)作为应用程序的输入,基于YoloV5s模型对输入视频中的物体做实时检测,将推理结果信息使用imshow方式显示。 样例代码逻辑如下所示: 环境信息 CPU:Intel Xeon Gold 63…

ASP.NET基于CS应用程序平台多语种技术应用研究

摘 要 C/S应用程序平台多语种技术是一种基于C/S应用技术结构平台的关于多语种的转换和翻译技术。本设计基于Visual Studio.Net集成开发环境,采用SQL Server2000进行数据库后台开发。通过采用数据字典实现应用系统的静态文本转换;通过使用Visual Studio.…

适用于 Windows 的 10 个顶级 PDF 编辑器 [免费和付费]

曾经打开PDF文件,感觉自己被困在数字迷宫中吗?无法编辑的文本、无法调整大小的图像以及签署感觉像是一件苦差事的文档?好吧,不用再担心了!本指南解开了在 Windows 上掌握 PDF 的秘密,其中包含 10 款适用于 …