数据库——数据库性能优化


title: 数据库——数据库性能优化
date: 2024-07-06 12:26:21
tags: 数据库
categories: 数据库
cover: /image/T1.jpg
description: 数据库——MySQL的性能优化

数据库优化

系统的吞吐量瓶颈往往出现在数据库的 访问速度 上,随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢,因为其数据是存放在 磁盘 上的,读写速度无法和内存相比,所以使用数据库时,十分有必要了解数据库优化问题。其优化原则为:减少系统瓶颈,减少资源占用,增加系统的反应速度。

数据库结构优化
优化目标:
  1. 减少数据冗余:确保相同的数据不会在多个地方重复存储,减少数据更新和维护的复杂性。
  2. 避免数据维护异常:包括插入异常、更新异常和删除异常,确保数据库操作的正确性和一致性。
  3. 节约存储空间:通过合理设计表结构和数据类型,减少不必要的存储空间浪费。
  4. 提高查询效率:优化表结构和索引,加快数据检索速度,提升系统性能。
优化策略:

在数据库设计中,针对字段很多或查询复杂的情况,采用表分解、增加中间表(以及合理添加冗余字段是常见的优化策略。

  1. 表分解(Normalization)
    将大表分解成多个小表,每个表专注于一组相关的数据,通过外键关联。这有助于减少数据冗余,提高数据一致性,并使数据库结构更清晰。

  2. 增加中间表(Denormalization for Query Optimization)
    为优化查询性能,可以创建中间表来存储频繁联合查询的结果。这样做可以减少查询时的连接操作,提高查询速度,但会增加数据冗余和更新维护的复杂性。

  3. 合理添加冗余字段
    在不影响数据一致性的前提下,为了减少查询时的连接操作,可以在表中添加一些冗余字段。这些字段存储了原本需要通过联合查询才能获得的数据,从而提高了查询效率,但增加了数据更新的复杂性和存储成本。

分库分表

分库分表是数据库架构设计的一种策略,旨在通过将大量数据分散存储到多个数据库或表中,以提升系统的性能、可扩展性和可用性。这种方法主要用于处理海量数据和高并发访问的情况。

分库分表通过“垂直切分”或“水平切分”的方式,将数据库或表拆分成多个较小的部分。垂直切分通常按业务模块划分,将不同业务的数据放在不同的数据库或表中。水平切分则根据数据的某种特征(如用户ID、时间等)将数据分散到多个数据库或表中。

这种策略的主要目的是减轻单一数据库或表的压力,提高查询和写入速度,同时支持系统的水平扩展,即通过增加更多的数据库或表来应对数据量的增长。此外,分库分表还能提高系统的可用性,因为即使某个数据库或表出现问题,其他部分仍然可以正常工作。

垂直切分和水平切分
  • 垂直切分:将表中的字段按照业务逻辑进行拆分,将相关的字段放在一起,形成一个新表。这种方式适用于按业务模块划分数据的场景。

  • 水平切分:将表中的数据按照某个规则(如用户ID、时间范围等)分散到多个数据库中,每个数据库存储部分数据。这种方式适用于数据量大的场景,可以有效缓解单一数据库的性能瓶颈。

可能的问题
  • 跨节点查询和事务一致性问题:分库分表后可能会面临跨节点查询和事务一致性的问题。这需要通过合理的设计和优化来解决,如使用分布式事务、数据一致性校验等机制。
  • 数据迁移和扩容问题:在分库分表后,随着业务的发展可能需要进行数据迁移和扩容。这需要提前规划好数据迁移和扩容的策略和方案,以确保系统的平稳运行。
MySQL主从复制

主从复制是指将 主数据库(Master)中的 DDL 和 DML 操作通过二进制日志传输到 从数据库(Slave) 上,然后将这些日志重新执行(重做),从而使得从数据库的数据与主数据库保持一致。MySQL 支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。

主从复制原理

MySQL 的主从复制是一个 异步 的复制过程(一般情况下感觉是实时的),数据将从一个 MySQL 数据库(Master)复制到另外一个 MySQL 数据库(Slave),在 Master 与 Slave 之间实现整个主从复制的过程是由三个线程参与完成的,其中有两个线程(SQL 线程和 I/O 线程)在 Slave 端,另外一个线程( I/O 线程)在 Master 端。

主从复制的作用有

  • 当主数据库出现问题时,可以切换到从数据库;
  • 可以进行数据库层面的读写分离,实现负载均衡;
  • 可以在从数据库上进行实时数据备份。
MySQL读写分离的实施方案

MySQL 读写分离的实现方式主要基于 主从复制,通过 路由的方式 使应用对数据库的写请求只在 Master 上进行,读请求在 Slave 上进行。

具体地,有以下四种实现方案:

  • 方案一:基于 MySQL proxy 代理

    在应用和数据库之间增加 代理层,代理层接收应用对数据库的请求,根据不同请求类型(即是读 read 还是写 write)转发到不同的实例,在实现读写分离的同时可以实现负载均衡。MySQL 的代理最常见的是 mysql-proxy、cobar、mycat、Atlas 等。

  • 方案二:基于应用内路由

    基于应用内路由的方式即为在应用程序中实现,针对不同的请求类型去不同的实例执行 SQL。具体实现可基于 spring 的 aop:用 aop 来拦截 spring 项目的 dao 层方法,根据方法名称就可以判断要执行的类型,进而动态切换主从数据源。

  • 方案三:基于 MySQL-Connector-Java 的 JDBC 驱动方式

    Java 程序通过在连接 MySQL 的 JDBC 中配置主库与从库等地址,JDBC 会自动将读请求发送给从库,将写请求发送给主库,此外, MySQL 的 JDBC 驱动还能够实现多个从库的负载均衡。

  • 方案四:基于 sharding-jdbc 的方式

    sharding-sphere 是强大的读写分离、分表分库中间件,sharding-jdbc 是 sharding-sphere 的核心模块。

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

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

相关文章

【密码学】密码学体系

密码学体系是信息安全领域的基石,它主要分为两大类:对称密码体制和非对称密码体制。 一、对称密码体制(Symmetric Cryptography) 在对称密码体制中,加密和解密使用相同的密钥。这意味着发送方和接收方都必须事先拥有这…

kubeadm离线部署kubernetesv1.30.0

背景:最近由于docker image获取镜像受限的问题,以及公司内部部署kubernetes受限于内部网络无法访问公网的问题,对于离线部署kubernetes成为不是十分方便。谨以此文仅供参考。 kubernetes部署节点信息 kubernetes版本 1.30.0 操作系统版本&a…

springboot2.7.6 集成swagger

在 Spring Boot 2.7.6 版本中集成 Swagger 的步骤相对直接,主要涉及添加依赖、编写配置以及在控制器中添加文档注解几个环节。 下面是集成 Swagger 的基本步骤: 1. 添加依赖 首先,在pom.xml文件中添加 Swagger 相关依赖。 对于 Spring Boot…

1-3 NLP为什么这么难做

1-3 NLP为什么这么难做 主目录点这里 字词结构的复杂性 中文以汉字为基础单位,一个词通常由一个或多个汉字组成,而不像英语词汇单元由字母构成。这使得中文分词(切分句子为词语)成为一个具有挑战性的任务。语言歧义性 中文中常…

提升机硬件设备的技术规格文档

提升机硬件设备技术规格文档 1. 产品概述 本技术规格文档旨在详细描述[公司名称]生产的[型号]型提升机的硬件设备技术参数、性能指标、安全特性及安装维护要求。该提升机设计用于[具体应用场景,如高层建筑、仓库货物搬运、家用等],旨在提供高效、安全、…

网络安全设备——蜜罐

网络安全设备蜜罐(Honeypot)是一种主动防御技术,它通过模拟真实网络环境中的易受攻击的目标,以吸引和监测攻击者的活动。具体来说,蜜罐是一种虚拟或实体的计算机系统,它模拟了一个真实的网络系统或应用程序…

AcWing 3207:门禁系统 ← 桶排序中“桶”的思想

【题目来源】https://www.acwing.com/problem/content/3210/【题目描述】 涛涛最近要负责图书馆的管理工作,需要记录下每天读者的到访情况。 每位读者有一个唯一编号,每条记录用读者的编号来表示。 给出读者的来访记录,请问每一条记录中的读者…

C语言的结构体写法

C语言中的结构体是一种用户自定义的数据类型,它可以同时存储多个不同类型的数据。结构体由多个成员变量组成,每个成员变量可以有不同的数据类型。 结构体的定义形式为: struct 结构体名 {数据类型 成员变量1;数据类型 成员变量2;// 其他成员…

Shell编程类-网站检测

Shell编程类-网站检测 面试题参考答法 a(1 2 3 4) echo ${a[0]} echo ${a[*]}这里声明一个数值,并选择逐个调用输出还是全部输出 curl -w %{http_code} urL/IPADDR常用-w选项去判断网站的状态,因为不加选择访问到的网站可能出现乱码无法判断是否网站down…

Xilinx FPGA:vivado关于fifo的一些零碎知识

一、FIFO概念 先进先出,是一种组织和操作数据结构的方法。在硬件应用中,FIFO一般由一些读写指针,存储和控制的逻辑组成。 二、xilinx中生成的FIFO的存储类型 (1)shift register FIFO : 移位寄存器FIFO,这…

【基础篇】1.8 C语言基础(二)更新中

三,位操作 在STM32开发中,位操作是非常重要的技术,特别是在处理器外设寄存器的配置和控制过程中。它可以有效地提高代码的性能、可维护性和可移植性。 3.1 位操作运算符 3.1.1 按位与(&) 运算规则:如果两个操作数的对应位都为 1,则结果为 1;否则为 0。示例:a &…

自动化设备上位机设计 三

目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 using SqlSugar;namespace 自动化上位机设计 {public partial class Form1 : Form{SqlHelper sqlHelper new SqlHelper();SqlSugarClient dbContent null;bool IsRun false;int Count 0;public Form1(){Initializ…

笔记:TypeDescriptor和反射

TypeDescriptor 和反射都是 .NET 中用于访问类型信息的机制,但它们在设计目的、使用场景和功能上有所不同。 反射 反射是 .NET 提供的一种机制,允许在运行时检查程序集、模块和类型的元数据。你可以使用反射动态地创建类型的实例、调用方法、访问字段和属…

【论文笔记】BEVCar: Camera-Radar Fusion for BEV Map and Object Segmentation

原文链接:https://arxiv.org/abs/2403.11761 0. 概述 本文的BEVCar模型是基于环视图像和雷达融合的BEV目标检测和地图分割模型,如图所示。模型的图像分支利用可变形注意力,将图像特征提升到BEV空间中,其中雷达数据用于初始化查询…

Tkinter布局助手

免费的功能基本可以满足快速开发布局, https://pytk.net/ iamxcd/tkinter-helper: 为tkinter打造的可视化拖拽布局界面设计小工具 (github.com) 作者也把项目开源了,有兴趣可以玩玩

羊大师:小暑至,热浪涌,三伏悠长防暑忙

随着夏日的脚步悄然加速,我们迎来了小暑节气。小暑,一个预示着盛夏正式拉开序幕的时节,它携带着滚滚热浪,让大地仿佛置身于火炉之中。而随之而来的三伏天,更是长达40天的酷热考验,让人不禁感叹夏日的漫长与…

MAX98357、MAX98357A、MAX98357B小巧、低成本、PCM D类IIS放大器,具有AB类性能中文说明规格书

前言: MAX98357A支持标准I2S数据,MAX98357B支持左对齐数字音频数据。两个版本均支持8通道TDM音频数据。 IIS数字功放MAX98357开发板/评估系统 MAX98357 WLP-9(1.347x1.437mm)封装的外观和丝印AKM MAX98357 TQFN-16-EP(3x3mm)封装的外观和丝印AKK 引脚说…

Fill - UVA 10603

网址如下&#xff1a; Fill - UVA 10603 - Virtual Judge (vjudge.net) 感觉有点浮躁&#xff0c;没法完全将思绪投入题的思考中 脑袋糊糊的 一道bfs题 代码如下&#xff1a; #include<queue> #include<cstdio> #include<cstring> #include<vector&g…

控制下属绝不是拍桌子、甩脸子、摆架子,一流领导都用这3招!

控制下属绝不是拍桌子、甩脸子、摆架子&#xff0c;一流领导都用这3招&#xff01; 第一招&#xff1a;规矩严 国有国法&#xff0c;家有家规&#xff0c;公司也不例外。 下属能不能和领导齐心&#xff0c;愿不愿意共同发力&#xff0c;全看管理者如何操控。 毫无疑问的是&a…

45 mysql truncate 的实现

前言 truncate 是一个我们也经常会使用到的命令 其作用类似于 delete from $table; 但是 他会比 delete 块很多&#xff0c;这里我们来看一下 它的实现 delete 的时候会逐行进行处理, 打上 删除标记, 然后 由后台任务 进行数据处理 truncate table 的实现 执行 sql 如下 …