MySQL 的性能

影响数据库性能的因素:

  1. SQL 脚本
  2. 数据库服务器配置
  3. 网卡流量
  4. 磁盘 IO
  5. 大表操作
  6. 大事务操作
  7. 存储引擎
  8. 数据库参数配置

1. SQL 脚本

超高的 QPS 和 TPS

  • TPS:英文全称是 Transactions Per Second,即服务器每秒处理的事务数。TPS 包括一条消息入和一条消息出,加上一次用户数据库访问。这里涉及到一个概念,就是事务。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数。
  • QPS:英文全称是 Queries Per Second,即每秒查询率。QPS 是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。举个例子:假设数据库处理一条 SQL 需要 10ms,那么 1s 就可以处理 100 条 SQL,那么我们说它 QPS<=100;假设数据库处理一条 SQL 需要 100ms,那么 1s 就可以处理 10 条 SQL,那么我们说它 QPS<=10

数据库连接被占满

数据库的连接数必然是有限的,在 MySQL 中,我们可以通过 max_connections 来设置数据库的连接数(这个值默认是 100,生产环境下这个值可以适当调大)。慢 SQL 由于处理时间较长,因此占用数据库连接的时间也较长,在高并发环境下这样就容易导致数据库连接被占满。

超高的 CPU 使用率

慢 SQL 还会导致超高的 CPU 使用率,超高的 CPU 使用率会导致 CPU 资源耗尽进而出现宕机。

2.数据库服务器配置

这个应该好理解,不需要我多说吧。

服务器的硬件如 CPU、内存、磁盘 IO 等都会影响到 MySQL 性能,操作系统也会影响到 MySQL 性能

3.网卡流量

网卡 IO 被占满了一样也是没法操作数据库。

  • 减少从服务器的数量,因为从服务器需要从主服务器同步数据,会占用网卡 IO(当然是在合理的范围内减少从服务器的数量)。
  • 数据分级缓存,避免突然的缓存失效对数据库形成冲击。
  • 避免 select *,不仅浪费时间,还浪费网络流量。
  • 分离业务网络和服务器网络。

4.磁盘 IO

磁盘 IO 对数据库性能的影响也是显而易见的,因为数据库无论怎么管理数据,最终都是要存入到硬盘中的,所以磁盘 IO 对数据库的影响也就非常重要了。但是这个问题的解决,就只能使用更好更快的磁盘设备,例如 SSD。

5.大表操作

  1. 慢查询:毕竟数据量大了,想要过滤出自己想要的数据,肯定费时间。从上千万上亿条数据中找出自己想要的数据,也会产生大量的磁盘 IO。
  2. DDL 操作恐怖:在大表上进行表定义操作也是一件非常恐怖的事情,例如建立索引、添加/删除 。

6.大事务操作

一些运行时间比较长,涉及到数据比较多的事务,我们可以称之为大事务。大事务会锁定很多条数据进行处理,这样就容易造成大量的阻塞和锁超时,并且一旦出错发生回滚,回滚所需要的时间也会比较长,而且在回滚期间数据依然处于被锁的状态。

由于大事务耗时较长,需要等到主库事务执行完毕后,将操作日志写入 binlog,然后从库读取 binlog 进行同步,这样势必会导致主从延迟。

解决大事务,两个思路:

  1. 避免一次性处理太多数据。
  2. 移除事务中不必要的 SELECT 操作。

7.存储引擎

使用 MySQL 我们可以选择不同的存储引擎,不同的存储引擎特点不同,最终对数据库的影响也不同。

MyISAM 不支持事务,而且是表级锁;InnoDB 是事务级存储引擎,支持行级锁,也支持事务的 ACID 特性。

8.数据库参数配置

原文地址:https://www.cnblogs.com/KL2016/p/15124087.html