前段时间在项目中碰到一个性能问题,故事的背景是在某一个页面(数据统计分析页面)有几个请求需要很长时间才能拿到 response,由于前后台都没有超时机制,导致了用户需要长时间的等待(5-10分钟),这显然是无法接受的。经过对每一个请求在 Controller/Service/DAO 耗时分析得出结论:导致上述现象发生的原因主要是 SQL 执行时间过长。

一条 SQL 语句的优劣可能会对性能造成很大的影响,说到性能问题,首先来说说几个基本的概念以及影响数据库性能的几个因素,毕竟,工欲善其事必先利其器,后面会详细说说 SQL 优化的措施及技巧。

在软件工程中,我们一般会用 QPS/TPS 作为指标来衡量一个软件系统的性能优劣。

单位时间内所处理的查询数(QPS):是 Queries Per Second 的缩写,意思是每秒查询率,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。

单位时间内所处理的事务数(TPS):是 Transactions Per Second 的缩写,也就是事务数/秒。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数。

TPS 即每秒处理事务数,包括:”用户请求服务器”、”服务器自己的内部处理”、”服务器返回给用户”,这三个过程,每秒能够完成N个这三个过程,TPS 也就是3;

QPS 基本类似于 TPS,但是不同的是,对于一个页面的一次访问,形成一个 TPS;但一次页面请求,可能产生多次对服务器的请求,服务器对这些请求,就可计入 QPS 之中;

一般的,评价系统性能均以每秒钟完成的技术交易的数量来衡量。系统整体处理能力取决于处理能力最低模块的TPS值;

QPS 对应 fetches/sec,即每秒的响应请求数,也即是最大吞吐能力。

在实际情况中,我们可能会碰到:

超高的 TPS/QPS:使 SQL 效率低下

大量的并发:可能导致数据库连接被占满

超高的 CPU 使用率:可能导致 CPU 资源耗尽而出现宕机

网卡 IO 过高:可能导致无法连接数据库

磁盘 IO 过高:磁盘 IO 性能突然下降

这些问题都可能对数据造成影响,所以影响数据库可能有如下几个因素:

大部分情况下,影响数据库的都是 SQL 查询速度,我们需要解决的也是由 SQL 查询速度过慢导致的性能其他几个因素相对来说解决起来也更容易。

而影响 SQL 查询速度有哪些因素呢?

服务器硬件:CPU,内存等

服务器系统:不同的系统中不同的文件系统,核心参数配置等也会造成一定的影响

数据库存储引擎:对于 MySQL 而言,主要的存储引擎是 MyISAM 和 InnoDB。MyISAM 不支持事务,表级锁;InnoDB 是事务级存储引擎,支持行级锁,事务 ACID 特性。关于这两种存储引擎以及其他存储引擎的特点和如何选择合适的存储引擎会做一篇推送详细分析。

数据库参数配置

数据库结构设计和 SQL 语句

关于数据库参数配置和数据库结构设计涉及到的知识比较多,下一篇推送会对此做详细叙述。