源自:http://www.jylt.cc/#/detail?id=20e99d5402d6fb9c390ab609b8211aac
导语:有些网站打开后加载特别慢,慢的原因多种多样,网络延时、页面渲染、数据响应等都有可能导致网站加载慢吞吞。所以当我们的网站加载速度比较慢的时候就需要考虑排查是什么原因,并去解决问题了,不然用户体验是极差的。
作为后端开发的一员,我们先探讨一下数据响应慢的问题。就是用户从发起网络请求到前端接收到后端响应这个过程耗时比较长的问题。既然说到数据交互,必然离不开数据库了。
关系型数据库有可能是整个后端数据处理最耗时的一个环节了。那么我们如何去判断是不是由于数据库的问题导致后端响应慢呢?又该如何去定位哪些SQL语句比较耗时呢?下面我们一起来看一下。
判断是不是由于数据库操作影响系统性能
统计SQL操作耗时
- 代码如下,如果rate比较小,说明数据库的操作对响应影响较小,并不是系统的瓶颈,有可能是程序代码编写有问题,需要对代码逻辑进行优化;如果rate比较大,就说明数据库耗时占了很大比重,需要对数据库操作进行优化了。
public void test() {
// 接口请求时间
long totalStart = System.currentTimeMillis();
long sqlStart = System.currentTimeMillis();
// sql操作....
long sqlEnd = System.currentTimeMillis();
// 接口响应时间
long totalEnd = System.currentTimeMillis();
double rate = (sqlEnd - sqlStart) * 1.0 / (totalEnd - totalStart);
}
- 使用第三方工具进行检测,比如阿里的druid数据库连接池,加入相关配置之后可以从面板更直观的监控sql的性能,更方便我们对问题的排查。
记录MySQL慢查询
MySQL慢查询就是在日志中记录运行比较慢的SQL语句,这个功能是需要开启才能使用的。
开启方法
- 通过修改/etc/my.cnf,添加配置
优点:全局生效
缺点:需要重启Mysql
- 通过SQL命令set global slow_query_log=1直接修改环境变量
优点:立即生效
缺点:只对当前数据库生效,重启Mysql后失效
配置/etc/my.cnf
#my.cnf文件
#是否开启慢查询日志,1表示开启,0表示关闭。
slow-query-log = 1
#MySQL数据库慢查询日志存储路径
slow-query-log-file = /var/log/mysql/mysql-slow.log
#慢查询阈值,当查询时间多于设定的阈值时,记录日志。单位:秒
long_query_time = 10
通过命令配置
show variables like ‘%slow_query_log%’;
set global slow_query_log=1
这样配置之后,如果有执行时间超过我们设置的阈值的SQL语句就会记录到我们设置的日志当中,我们就可以有针对性的去对某些SQL进行优化了。