MySQL数据库优化一、影响数据库服务的因素

关于MySQL数据库,我们来看一下有哪些因素会对数据库的性能造成影响,我们对这些因素进行分析,如何对其优化,以提升数据库的性能。

1 服务器性能的提升问题

不管是何种的互联网应用,都离不开我们的服务器。我们想要获得更高的性能,提高并发量与吞吐量,服务器优化是非常重要的。
我们的服务器可以有 web服务器和数据库服务器。对于web服务器我们很容易的进行横向扩展。换句话说,我们只要有足够的服务器,就可以部署足够多的web程序。我们的web服务程序是一样的,对外提供的服务也是一样的。
但是数据库的扩展就没有 那么容易。我们数据库服务器上的数据就不能吧像web服务器一般随便的复制拷贝就可以使用。因为数据库的数据是要有完整性一致性的。如果是多出写入了相同的数据,那么这种完整性和一致性都会遭到破坏。数据库服务器的扩展才是让我们头疼的事情。

2 传统的数据库架构

对于一般的服务,我们都会有一个数据库进行数据的存储。为了降低风险,避免数据丢失,一般会设有许多从服务器。也就是一主多从的架构
在这里插入图片描述
这个架构会有什么问题?

  • 只有一个主服务器,没有高可用的主从复制的组件。如果主服务器出现故障,那么就需要手动的在从服务器选出一个数据最新的服务器作为主数据服务器。同时其他的从服务器再从最新的主服务器进行同步。这样的一个操作是非常耗时的。在数据量大的时候,对于主服务器的网卡也是很大的挑战

影响数据库的因素

1、SQL的查询速度
2、服务器硬件
3、网卡流量
4、磁盘IO

造成的影响

超高的qps和tps

风险:会导致效率低下的SQL。
当网站的访问量大幅增长的时候,就会产生超高的qps和tps。这时每个SQL的处理时间就非常重要。在当前的MySQL版本,并不支持多CPU运算 。如果10ms处理一个SQL,那么1s钟就会处理100个SQL,qps就会小于等于100。那如果100ms处理一个SQL,1s中就处理10个SQL,qps就会小于等于10。可见SQL的执行效率是非常重要的。根据经验来看,数据库的性能80%都是由于慢查询造成的。

QPS: 每秒钟处理完请求的次数;注意这里是处理完。具体是指发出请求到服务器处理完成功返回结果。可以理解在server中有个counter,每处理一个请求加1,1秒后counter=QPS。
TPS:每秒钟处理完的事务次数,一般TPS是对整个系统来讲的。一个应用系统1s能完成多少事务处理,一个事务在分布式处理中,可能会对应多个请求,对于衡量单个接口服务的处理能力,用QPS比较多。

大量的并发和超高的CPU使用率

风险:
1、大量并发:数据库连接数占满
2、高CPU使用率:因CPU资源耗尽而宕机

这里容易混淆的两个概念,并发量和连接量。并发量是指同一时刻请请求的数量,而连接量会比并发量大的多,web服务器通常会建立多个数据库连接,并不会只有请求来的时候才会连接。

数据库的最大连接数是有限的,一般这个限制是由 MySQL数据库中的max_connections 参数决定的,这个参数的默认值是100。生产服务器一定要把这个参数的值改的大一些,之后写数据库优化时再详细说明如何修改。如果连接数已经占满,那么后来的请求就无法连接到数据库服务器,前端会报500错误,对于用户使用造成影响

磁盘的IO

数据库的主要瓶颈之一就是磁盘IO
风险:
1、磁盘IO性能突然下降。
这一般是由于热数据远远大于服务器可用内存。解决办法只能是使用更快的磁盘设备,比如使用更好的RAID卡、SSD等设备。关于设备的选择,在后面数据库硬件优化上面再详细说明。

2、其他大量消耗磁盘性能的计划任务
如果有定时的备份计划,那么在备份这一时间段就会导致大量的磁盘消耗。对于网站大的活动之前,一定要注意暂时取消备份计划,否则网站活动引起的大的访问量会导致磁盘性能的下降,访问速度就会变慢。平时的时候,也要做好磁盘的维护。

网卡流量

风险: 网卡IO占满
当网卡IO被占满,将会导致无法连接到数据库服务器。我们可以从以下几点避免网卡导致的无法连接的问题。
1、减少从服务器的数量
2、进行分级缓存
3、避免使用select * 进行查询
4、把业务网络和服务器网络进行分离

其他影响数据库性能因素

大表带来的问题

MySQL并没有对多大数据量的表是大表做定义,大表的概念也是相对的。大表我们可以从两个维度去定义,一是记录行数巨大,如千万行以上;二是表数据文件巨大,比如一个表数据文件好几个G。

1、大表对查询的影响

慢查询:很难在一定的时间内过滤出来所需的数据

2、大表对DDL操作的影响

建立索引需要很长时间。MySQL5.5之前,建立索引会锁表。MySQL5.5之后的版本虽然不会锁表但也会引起主从延迟

修改表结构需要长时间锁表。这会造成长时间的主从延迟。因为长时间锁表,也会引起正常数据的操作,产生阻塞。

如何处理大表

对于大表的处理,我们会有两种方式,一种是分库分表,二是对大表进行历史 数据归档。
分库分表:分库分表我们需要解决两个难点,一是关键键的选择。对于业务的不同,我们会有多种分表的方式。二是分表之后,跨分区数据的查询。分表之后肯定会产生分表数据,就算是选择好的分表关键键,也不能避免不会有跨分区查询的产生。好的分表键可以减少跨分区查询,但不能避免这个问题。

历史数据归档:进行历史数据归档的好处就是会减少对前后端业务的影响。对于前段来讲,表数据结构没有产生任何变化,业务正常运行。对于历史记录我们可以增加一个历史记录查询的入口,一般对于已经归档历史记录很少有人进行查询,所以就算归档表很大,也不会产生太大的问题。归档表也可以放在不同的服务器上,这样也减少了热数据对于数据库服务器的压力。

我们进行历史数据归档也有两个难点,一是归档时间的选择,二是如何进行归档操作。归档时间也根据业务场景的使用频率来决定。比如日志表我们可以归档前一周的数据,对于订单类表我们可以归档一年前的数据。我们对归档操作也需要格外的小心,我们要把已经归档的历史数据从现有的表中删除。对于大表来讲,增删改操作不当轻则会造成主从延迟,重则造成严重阻塞。

大事务带来的影响

什么是事务

事务是关系型数据库系统区别与其他一切文件系统的重要特性之一。举例来讲,其他文件系统很难保证两个文件数据的统一,而数据库由于事务的存在,在数据库崩溃的时候,可以很容易的恢复数据库中的数据,使数据保持一致性。
事务是一组具有原子性的SQL语句,或是一个独立的工作单元。事务中的SQL是有原子性的,要么全部完成,要么全部失败。

事务具备原子性、一致性、隔离性、持久性。

原子性:

一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败,对于一个事务来说,不可能只执行其中一部分操作。

一致性:

一致性是指事务将数据库从一种一致性状态转换到另一种一致性状态,在事务开始之前和事务结束之后数据库中数据的完整性没有被破坏。

隔离性:

隔离性要求一个事务对数据库中数据的修改,在未提交完成前对于其他事务是不可见的。
SQL标准中定义了四种隔离级别:

持久性:

一旦 事务提交,则其所作的修改就会永久保存在数据库中。此时即使系统崩溃,已提交的数据也不会丢失。

什么是大事务

定义:

对于那些运行时间比较长,操作数据比较多的事务

风险:

锁定太多的数据,造成大量的阻塞和锁超时
回滚所需要的时间比较长
执行时间长,容易造成主从延迟

如何处理

1、避免一次处理太多得数据,可以分批次操作数据
2、移除不必要在事务中的select操作

本篇主要对影响MySQL数据库效率的几个方面做了分析 ,有了一个大概的认识。之后对于各个方面的优化再做详细说明。

发布了95 篇原创文章 · 获赞 35 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/u013513053/article/details/99713798
今日推荐