DBA技术栈(三):MySQL 性能影响因素
文章目录
- 前言
- 一、影响MySQL性能的因素
- 1.1 商业上的需求
- 1.2 应用架构规划
- 1.3 查询语句使用方式
- 1.4 Schema的设计
- 1.5 硬件环境
- 总结
前言
大部分人都一致认为一个数据库应用系统(这里的数据库应用系统概指所有使用数据库的系统)的性能瓶颈最容易出现在数据的操作方面,而数据库应用系统的大部分数据操作都是通过数据库管理软件所提供的相关接口来完成的。所以数据库管理软件也就很自然的成为了数据库应用系统的性能瓶颈所在,这是当前业界比较普遍的一个看法。数据库有使用场景的适配性,不能认为关系型数据库是万能的。比如大批量数据的离线报表,应借助hive离线数仓去解决,设计到视频/图片等数据可以借助hbase或是图数据库等。
一、影响MySQL性能的因素
1.1 商业上的需求
高并发:如果业务需要处理大量的并发请求,那么MySQL的性能就会受到影响,因为MyQL在高并发的情况下可能会出现瓶颈。
数据量大:如果业务需要存储和管理大量的数据,那么MySQL可能会出现性能瓶颈,因为MySQL需要处理大量的数据读写操作。
数据复杂性:如果业务需要对复杂的数据进行查询,那么MySQL需要处理的数据结构就会变得更加复杂,从而影响性能。
数据安全性:如果业务对数据的安全性有较高的要求,那么MySQL就需要更多的资源来保证数据的安全性,从而影响性能表现。
数据更新频率:如果业务需要频繁更新数据,那么MyQL的性能就会降低,因为MyQL需要处理大量的更新操作。
数据备份和恢复:如果业务需要进行数据备份和恢复,那么MySQL也需要消耗更多的资源来保证数据的安全性,从而影响性能表现。
1.2 应用架构规划
-
数据库连接数
应用架构中数据库连接数的设置会直接影响MySQL数据库连接池的大小,从而影响数据库的性能。连接池的大小决定了应用系统可以同时连接数据库的最大数。如果连接池设置太小,会导致数据库连接数不足,从而影响数据库性能。如果连接池大小设置太大,会浪费数据库连接资源,导致性能下降。 -
数据库读写分离
在应用架构中,如果使用数据库读写分离的方式来处理读写操作,会影响MySQL的性能。读写分离会导致数据的读写操作分散到不同的数据库实例上,从而增加了数据同步的开销,可能会导致数据不一致的问题。因此,在使用读写分离时需要考虑数据同步的方式和策略,以最小化成本。 -
缓存架构
应用架构中考虑使用缓存来加速数据访问,会影响MySql的性能。缓存可以有效降低数据库的访问次数,从而减轻数据库的压力。但是,缓存的使用需要考虑缓存的过期时间、缓存数据的一致性等问题,否则可能会导致数据不一致或者缓存数据过多占用过多的内存资源。 -
数据库分库分表
在应用架构中,如果需要处理海量数据,可能需要采用分库分表的方式来扩展数据库性能。分库分表会导致数据的分散,增加了数据同步的开销,可能会导致数据一致性的问题。因此,在采用分库分表的方式时需要考虑数据同步的方式和策略,以最小化成本。 -
数据库集群架构
在应用架构中,如果需要处理高并发、大数据量的请求,可能需要采用数据库集群的方式来扩展数据库性能。数据库集群会导致数据的分布式处理,增加了数据同步和负载均衡的开销,可能导致性能问题。因此,在采用数据库集群的方式时需要考虑集群的负载均衡和故障转移等问题,以保证数据库的性能和可用性。
1.3 查询语句使用方式
如果查询语句不够优化,可能会导致性能问题,例如查询速度变慢、占用过多的资源等。因此,需要编写高效的查询语句,尽可能地利用索引和优化器,以提高查询性能。
以下是一些查询语句对MySql性能的影响:
SELECT COUNT(*) FROM table_name;
这种查询语句通常用于统计表中记录数,虽然它的执行速度很快,但是如果表很大,则会消耗很多内存资源,从而降低系统性能。
SELECT * FROM large_table LIMIT 0,1000;
这种语句用于从大型表中获取前几条记录,由于MySql默认不会使用索引,所以每次查询都会扫描整张表,导致查询速度非常慢。解决方案是为该表添加适当的索引,以便MySql可以使用索引来加快查询速度。
SELECT column_name, column_name FROM large_table;
如果表非常大,则每次查询都需要扫描整张表。为了提高查询性能,可以为表添加适当的分区,并使用分区查询来提高查询速度。
SELECT column_name FROM table_name JOIN other_table ON table_name.column_name = other_table.column_name;
如果两个表之间的连接条件不是一个唯一的键,则查询性能可能会受到影响。在这种情况下,可以使用索引来加快查询速度。
SELECT column_name, column_name, column_name, ... FROM large_table WHERE column_name = 'value' OR column_name = 'value';
如果查询语句中包含多个OR条件,MySql需要扫描所有的OR条件,并对每个条件进行单独查询。这将导致查询性能下降。解决方案是使用UNION ALL语句将多个子查询合并成一个,或者将多个条件合并成一个子查询。
SELECT column_name, column_name, column_name, ... FROM large_table WHERE column_name = 'value' AND column_name = 'value';
如果查询语句中包含多个AND条件,MySql需要扫描所有的AND条件,并对每个条件进行单独查询。这将导致查询性能下降。解决方案是使用UNION ALL语句将多个子查询合并成一个,或者将多个条件合并成一个子查询。
SELECT column1, column2 FROM large_table WHERE column1 = 'value1'
UNION ALL
SELECT column3, column4 FROM large_table WHERE column3 = 'value3';
SELECT column_name, column_name, column_name, ... FROM large_table WHERE column_name BETWEEN value1 AND value2;
如果WHERE子句中包含BETWEEN条件,MySql可能需要扫描大量数据,导致查询性能下降,解决方案是使用适当的索引来加快查询。
SELECT column_name1, column_name2 FROM table_name GROUP BY column_name1;
如果GROUP BY子句中包含非唯一列,MySql需要对每个唯一值进行分组,这将导致查询速度变慢。解决方案可以是使用唯一列作为GROUP BY子句的列,或者使用UNIQUE索引来加快查询性能。
SELECT column_name WHERE column_name > 'value';
如果WHERE子句句式中包含一个大于号,MySql需要使用全表扫描,这将导致性能下降。解决方法是使用索引来加快全表扫描的速度。
SELECT COUNT(column_name) FROM table_name WHERE column1 = 'value' and column2 = 'value';
如果查询中包含多个条件,MySQL可能需要扫描大量的行,导致性能下降。解决方法是使用适当的索引来加快查询速度。
1.4 Schema的设计
-
数据冗余
在数据库表结构设计中,数据冗余是指在多个表中存储相同的数据,例如,在不同的表中存储相同字段的数据。如果数据冗余过多,会导致数据不一致以及查询效率低下。因此,在设计表结构时,应该尽量减少数据冗余,只在必要的情况下使用冗余数据。 -
索引设计
索引是数据库中非常重要的一部分,它可以大大提高查询效率。在设计表结构和创建索引时,应该考虑到查询的需求和数据的分布情况,合理设计索引可以提高查询效率。例如,在经常被查询的列上创建索引,可以大大提高查询速度。 -
表结构设计
在设计表结构的时候,应该考虑到表的大小、数据类型、存储引擎等因素。例如,如果表中的列非常大,会占用过多的内存和磁盘空间,导致查询效率降低。因此,应该尽量减少列的大小,使用合适的数据类型。另外,选择合适的存储引擎也会影响数据库的性能,例如InnoDB和MyISAM存储引擎有不同的性能特点,应该根据具体情况选择合适的存储类型。 -
表关联设计
在数据库中,表之间的关联关系非常重要,但是如果设计不当,会导致性能问题。例如,在设计关联表时,应该尽量减少表之间的关联次数,避免出现嵌套表和过多的关联操作。另外,应该尽量避免使用复杂的关联查询,而是采用简单的查询语句来获取所需信息。 -
数据库分区
在数据库中,数据分区可以提高数据库的性能和可扩展性。通过将数据按照一定规则分成多个区域,可以减少查询时的数据量,提高查询效率。例如,可以将数据按照地理位置、时间等因素分成不同的区域,从而提高查询效率。
1.5 硬件环境
MySQL数据库的性能受到硬件资源的限制,包括CPU、内存、磁盘、网络等。如果硬件资源不足,MySQL数据库可能会出现性能问题,例如响应时间变慢、查询速度变慢等。因此,在选择硬件资源时需要充分考虑MySQL数据库的负载情况,以确保足够的资源来支持MySQL数据库的运行。
总结
以上介绍了影响数据性能的因素,可能不够全面,还望各位看官指出,评论交流~
相关文章:

DBA技术栈(三):MySQL 性能影响因素
文章目录 前言一、影响MySQL性能的因素1.1 商业上的需求1.2 应用架构规划1.3 查询语句使用方式1.4 Schema的设计1.5 硬件环境 总结 前言 大部分人都一致认为一个数据库应用系统(这里的数据库应用系统概指所有使用数据库的系统)的性能瓶颈最容易出现在数…...

SpringCloud GateWay 在全局过滤器中注入OpenFeign网关后无法启动
目录 一、问题 二、原因 1、修改配置 2、添加Lazy注解在client上面 3、启动成功 一、问题 当在gateway的全局过滤器GlobalFilter中注入OpenFeign接口的时候会一直卡在路由中,但是不会进一步,导致启动未成功也未报错失败 2024-01-18 22:06:59.299 I…...

web前端项目-贪吃蛇小游戏【附源码】
web前端项目-贪吃蛇小游戏 【贪吃蛇】是一款经典的小游戏,采用HTML、CSS和JavaScript技术进行开发,玩家通过控制一条蛇在地图上移动,蛇的目的是吃掉地图上的食物,并且让自己变得更长。游戏的核心玩法是控制蛇的移动方向和长度&am…...

ICCV2023 | PTUnifier+:通过Soft Prompts(软提示)统一医学视觉语言预训练
论文标题:Towards Unifying Medical Vision-and-Language Pre-training via Soft Prompts 代码:https://github.com/zhjohnchan/ptunifier Fusion-encoder type和Dual-encoder type。前者在多模态任务中具有优势,因为模态之间有充分的相互…...

代码随想录 Leetcode459. 重复的子字符串(KMP算法)
题目: 代码(首刷看解析 KMP算法 2024年1月18日): class Solution { public:void getNext(string& s,vector<int>& next) {int j 0;next[0] j;for (int i 1; i < s.size(); i) {while (j > 0 && s…...

Rust之构建命令行程序(三):重构改进模块化和错误处理
开发环境 Windows 10Rust 1.74.1 VS Code 1.85.1 项目工程 这次创建了新的工程minigrep. 重构改进模块化和错误处理 为了改进我们的程序,我们将修复与程序结构及其处理潜在错误的方式有关的四个问题。首先,我们的main函数现在执行两项任务:解析参数和…...

广和通AI解决方案“智”赋室外机器人迈向新天地!
大模型趋势下,行业机器人将具备更完善的交互与自主能力,逐步迈向AI 2.0时代,成为人工智能技术全面爆发的重要基础。随着行业智能化,更多机器人应用将从“室内”走向“室外”,承担更多高风险、高智能工作。复杂的室外环…...

C++I/O流——(4)格式化输入/输出(第二节)
归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言📝 含泪播种的人一定能含笑收获ÿ…...

九、K8S-label和label Selector
label和label selector 标签和标签选择器 1、label 标签: 一个label就是一个key/value对 label 特性: label可以被附加到各种资源对象上一个资源对象可以定义任意数量的label同一个label可以被添加到任意数量的资源上 2、label selector 标签选择器 L…...

【.NET Core】 多线程之(Thread)详解
【.NET Core】 多线程之(Thread)详解 文章目录 【.NET Core】 多线程之(Thread)详解一、概述二、线程的创建和使用2.1 ThreadStart用于无返回值,无参数的方法2.2 ParameterizedThreadStart:用于带参数的方法 三、线程的…...

苹果笔记本 macbook 在 office word 中使用 mathtype 的方法
前言 想在 MacBook 中使用 mathtype,去搜索,去 Apple Store 下载也发现没有 解决方法 打开 office Word 的「插入」中的「获取加载项」、「我的加载项」。 在应用商店中下载,需要登录自己的微软账号。 加载成功后就可以使用了。 注意 和…...

课表排课小程序怎么制作?多少钱?
在当今的数字化时代,无论是购物、支付、点餐,还是工作、学习,都离不开各种各样的微信小程序。其中,课表排课小程序就是许多教育机构和学校必不可少的工具。那么课表排课小程序怎么制作呢?又需要多少钱呢? …...

C语言总结十三:程序环境和预处理详细总结
了解程序的运行环境可以让我们更加清楚的程序的底层运行的每一个步骤和过程,做到心中有数,预处理阶段是在预编译阶段完成,掌握常用的预处理命令语法,可以让我们正确的使用预处理命令,从而提高代码的开发能力和阅读别人…...

tinyxml2
使用tinyxml2,得知道一些xml基础 xml tutorial--菜鸟 tinyxml2类对象 链接 结构 XMLNode 什么是节点 节点:元素、声明、文本、注释等。 XMLDocument xml文档(文件)对象。 作用: 加载xml文件, tinyxml2作用 先定义两个宏 …...

What is `@Controller` does?
Controller 是SpringMVC注解,标记一个类作为Web控制器(Controller),负责处理HTTP请求并返回响应结果 在SpringMVC中,控制器类的主要职责是: 1、接收来自客户端的HTTP请求 2、调用服务层或其他业务逻辑组件…...

新版AndroidStudio dependencyResolutionManagement出错
在新版AndroidStudio中想像使用4.2版本或者4.3版本的AndroidStudio来构造项目?那下面这些坑我们就需要来避免了,否则会出各种各样的问题。 一.我们先来看看新旧两个版本的不同。 1.jdk版本的不同 新版默认是jdk17 旧版默认是jdk8 所以在新版AndroidSt…...

第三天业务题
3-1 你们的项目是如何进行参数校验的 在我们的项目中,通常使用以下2种方式进行参数校验: 1.手动校验:在方法内部,我们可以手动编写代码来对参数进行校验。例如,使用条件判断语句(if-else)来检…...

nestjs 装饰器
1、装饰器定义 装饰器是一种特殊的类型声明,它可以附加在类、方法、属性、参数上边 需开启tsconfig.json中 "experimentalDecorators":true 生成tsconfig.json文件 tsc -init 2、类装饰器 // 类装饰器 主要是通过符号添加装饰器 // 装饰器会自动把cl…...

一款开源且不限制大小可以设置过期时间的支持分享的的开源文件共享系统picoshare 部署教程
1.拉取镜像 2.部署 创建目录 mkdir -p /opt/picoshare/data 部署 其中:"somesecretpass"是密码 docker run \--env "PORT4001" \--env "PS_SHARED_SECRETsomesecretpass" \--publish 10005:4001/tcp \--volume "/opt/picoshare/data:…...

eBPF运行时安全
引言 eBPF作为当前linux系统上最为炙手可热的技术,通常被用于网络流量过滤和分析、系统调用跟踪、性能优化、安全监控,当下比较知名的项目有Cilium、Falco等。 Cilium 是一个开源的容器网络和安全性项目,致力于提供高效的容器通信和强大的安…...

Linux 系统中常见的命令,它们用于执行各种任务,包括文件和目录管理、系统信息查看、用户管理等
以下是一些在 Linux 系统中常见的命令,它们用于执行各种任务,包括文件和目录管理、系统信息查看、用户管理等。这里列举了一些基础的命令: 文件和目录管理: ls: 列出目录内容。 ls cd: 切换当前目录。 cd /path/to/directory …...

AutoEventWireup详解
AutoEventWireup详解 大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天,让我们深入探讨.NET开发中一个神奇而强大的特性——AutoEventWireupÿ…...

SAP ABAP 自定义流水号 编号范围
前言 在开发中经常会遇到生成编号的需求(如接口报文ID,自建表数据主键等);为此,SAP提供了自动编号工具,能根用户需求设定并自动生成一组唯一的编号。 编号范围对象的创建 1.进入事务代码SNRO,创建一个编号范围对象。…...

安卓、ios系统详解
一、安卓 安卓系统架构:从上至下,依次是应用层、应用框架层、系统运行库层和Linux内核层 应用层(system app):系统内置的应用程序及非系统级的应用程序都属于应用层,负责与用于进行交互,一般都用java或者kotlin来开发应用框架层(java api framework):为应用层提供所需…...

含并行连结的网络(GoogLeNet)
目录 1.GoogLeNet 2.代码 1.GoogLeNet inception不改变高宽,只改变通道数。GoogLeNet也大量使用1*1卷积,把它当作全连接用。 V3耗内存比较多,计算比较慢,但是精度比较准确。 2.代码 import torch from torch import nn from t…...

计算机网络(第六版)复习提纲3
2.3 物理层下面的传输媒体 传输媒体是数据传输系统中在发送器和接收器之间的物理通道,有导引型传输媒体(有线)和非导引型传输媒体(无线) 1.双绞线:两条铜线绞合,以减少干扰,绞合度越…...

怿星科技测试实验室获CNAS实验室认可,汽车以太网检测能力达国际标准
2023年12月27日,上海怿星电子科技有限公司测试实验室(下称:EPT LABS)通过CNAS实验室认可批准,并于2024年1月5日正式取得CNAS实验室认可证书(注册号CNAS L19826),标志着怿星科技的实验…...

GORM 介绍及快速入门
GORM 介绍及快速入门 前言 GORM 是一个用 GoLang 语言编写的 ORM(对象关系映射)库。它被设计为开发者友好的方式来进行数据库操作。GORM 提供了一种高级的 API 来处理数据库的 CRUD(创建、读取、更新、删除)操作,它支…...

Scrcpy:掌握你的Android设备
Scrcpy:掌握你的Android设备 本文将介绍Scrcpy工具,它是一种强大的安卓设备控制工具,可以实现屏幕镜像、操作控制等功能。我们将探讨Scrcpy的基本原理和工作方式,并介绍如何使用Scrcpy连接和控制安卓设备。此外,我们还…...

[9, 8, 7, 6][1,2] = ?
当我们运行这段代码时,控制台中会记录什么值? const arr [9, 8, 7, 6]; const res arr[1, 2]; console.log(res);当我们运行这段代码时,res 的值将是 7。并且控制台中会打印出 7。 让我们来详细分析一下。 第一步:[1, 2] 会被转换成 [2]。 为什么? 后续的元素 [1, 2] …...