当前位置: 首页 > 科技观察

什么会影响MySQL的性能?

时间:2023-03-13 04:03:37 科技观察

宋哥最近有两个小伙伴在帮人改造一个系统。对方原来的系统是用JavaGUI做的桌面应用,现在需要用SpringBoot改成web应用。原来的应用在Mac上运行的时候很丝滑,但是在Windows上运行的时候就很卡了。经过分析,发现每次查询都非常慢,因为数据库中的数据量很大。为了解决这个问题,他们特地来请教宋歌。也借此机会整理了数据库优化的基本操作,形成了好几篇文章,以后会一一分享给小伙伴们。今天我们主要看看什么影响了数据库的性能?只有找到问题的原因,才能解决问题。总体来说,影响数据库性能的因素可以分为以下几个方面:SQL脚本数据库服务器配置网卡流量磁盘IO大表操作大事务操作存储引擎数据库参数配置下面我们就从这几个方面一一梳理一下是解释。1.SQL脚本SQL脚本会影响MySQL的执行效率。这个大家都懂,是面试八股文的通病之一。其实并不是面试官故意喜欢考这个题,而是这个东西太重要了。根据松哥的经验,80%的数据库问题都是SQL慢引起的,可以通过SQL优化来解决,所以SQL优化技能对开发人员来说非常重要(有条件的公司也可以聘请DBA,但大部分公司没有DBA),这也是为什么我们在面试中经常会遇到SQL优化的原因。那么慢SQL有哪些风险呢?超高的QPS和TPS可能有些人不知道QPS和TPS是什么,这里就对这两个做一个简单的介绍。TPS:英文全称TransactionsPerSecond,即服务器每秒处理的事务数。TPS由消息输入和消息输出以及用户数据库访问组成。这里涉及到一个概念,就是商业。事务是客户端向服务器发送请求,服务器响应的过程。客户端在发送请求时开始计时,收到服务器的响应后结束计时,从而计算所用时间和完成的事务数。QPS:英文全称QueriesPerSecond,即每秒的查询率。QPS是衡量特定查询服务器在指定时间内处理多少流量的指标。例如:假设数据库处理一条SQL需要10ms,那么1s可以处理100条SQL,那么我们说QPS<=100;假设数据库处理一条SQL需要100ms,那么1s可以处理10条SQL,那么我们说QPS<=10。我们经常用QPS和TPS来衡量SQL的处理效率。数据库连接满了很容易理解。必须限制数据库连接数。在MySQL中,我们可以通过max_connections来设置数据库连接数(这个值默认是100,生产环境可以适当调整这个值)。由于慢SQL的处理时间长,所以连接数据库需要很长时间。在高并发环境下,很容易导致数据库连接被占满。超高的CPU使用率和慢SQL也会导致超高的CPU使用率,从而导致CPU资源耗尽和宕机。慢SQL真的很害人!2、数据库服务器配置应该很容易理解,就不用多说了。CPU、内存、磁盘IO等服务器硬件都会影响MySQL的性能,操作系统也会影响MySQL的性能。3.网卡流量网卡流量当然会影响数据库。如果网卡IO满了,也是无法操作数据库的,那么如何避免这种情况呢?减少从服务器数量,因为从服务器需要从主服务器同步数据,会占用网卡IO(当然在合理范围内)从服务器数量)。分层数据缓存可防止突然的缓存故障影响数据库。避免select*,不仅浪费时间,还浪费网络流量。独立的业务网络和服务器网络。4、磁盘IO磁盘IO对数据库性能的影响也是很明显的,因为无论数据库如何管理数据,最终都会存储在硬盘中,所以磁盘IO对数据库的影响也是非常重要的。但是要解决这个问题,只能使用更好更快的磁盘设备,比如SSD。另外,我们每天可能会有一些定期的磁盘维护计划。在一些高并发场景下(比如促销、618、双11等),我们需要调整磁盘维护计划,避免在这些时候进行磁盘维护。同时,一些消耗磁盘IO较多的任务,比如备份,此时也需要进行调整。例如,原来在主库上做的数据备份工作,在促销期间可以在从库上做。5、大表操作大表操作也会影响数据库性能,那么什么样的表才算是大表呢?大表没有统一的标准,还是需要结合具体的业务场景来确定。我举一个比较常规的例子:数据表的行数超过千万行。数据表文件超过10G。当然,上述定义并不是绝对的。如果是操作日志表,日志表一般只涉及insert和简单的query,基本不会有delete和update,所以对于这种表,即使超过千万OK,也不影响我们商业。但是如果是订单表之类的业务表,超过千万行就得小心了。大表会带来什么问题?慢查询:毕竟数据量大,过滤出自己想要的数据肯定需要时间。从几千万条数据中找到自己想要的数据,也会产生大量的磁盘IO。DDL操作恐怖:对大表的表定义操作也是一件很恐怖的事情,比如建立索引,增/删字段,想想都觉得恐怖。在MySQL5.5(不包括)之前,建立索引会锁定表。从MySQL5.5(含)开始,虽然建立索引不会锁表,但是会造成主从延迟(因为操作必须在主库上完成后,将操作日志传输到从库,然后完成同步)。这是大表引起的问题。一般来说,我们有两种常见的解决方案:分库分表历史数据归档至于什么时候使用分库分表,什么时候使用历史数据归档,松哥会在一节中给大家介绍未来的文章。6.大事务操作一些运行时间长、涉及数据量大的事务可以称为大事务。大事务会锁住很多条数据进行处理,容易造成很多阻塞和锁超时,而且一旦出错,回滚时间会很长,回滚状态下数据仍然处于锁定状态。同时,由于大事务耗时较长,需要等到主库事务执行完毕,将操作日志写入binlog,再从库中读取binlog进行同步,这样会必然导致主从延迟。解决大事务,有两种思路:避免一次处理过多的数据。删除事务中不必要的SELECT操作。具体操作方法将在以后的文章中介绍。7、存储引擎使用MySQL我们可以选择不同的存储引擎,不同的存储引擎有不同的特点,最终对数据库的影响也不同。比如MySQL中常见的MyISAM、InnoDB等存储引擎。MyISAM不支持事务,是表级锁;InnoDB是一个事务级的存储引擎,支持行级锁,也支持事务的ACID特性。那么是不是说InnoDB就一定比MyISAM好呢?不必要!这个还是要看具体的使用场景。8.数据库参数配置我们都知道数据库有很多配置参数,我们可以在优化数据库的时候配置它们,比如上面提到的max_connections。在这些参数中,有的参数对数据库的性能影响较大,有的参数影响较小。我们将在以后的文章中详细讨论这一点。好了,今天主要是和小伙伴们讨论一下,在我们日常的开发中,有哪些东西会影响数据库的性能!至于具体的解决办法,宋哥会在下一篇文章中和大家详细聊聊。虽然我们不是专业的DBA,但是从小伙伴们的面试经历来看,显然不能对数据库优化一无所知。本文转载自微信公众号“江南的一场小雨”,可通过以下二维码关注。转载本文请联系江南一点鱼公众号。