场景和现象说明:

并发30个,响应时间不达标。

监控服务器,发现cpu使用率占用一直很高且接近100%,内存使用率基本保持不变;

mysql 内存利用率 过高_sql

 

问题:响应时间平均大于2秒,最高能达到4秒多,不达标(需求平均响应时间<500毫秒);

mysql 内存利用率 过高_性能优化_02

 

监控现象:

1、服务器cpu使用率占用一直很高且接近100%;

2、服务器内存使用率基本保持不变;

3、响应时间平均大于2秒,最高能达到4秒多;

原因分析:

1、SQL语句存在大量的慢查询,导致mysql数据库进程CPU占用高;

2、再深究慢查询的SQL语句,发现使用全表查询未使用索引。

解决方案:使用索引替换全表查询方式;

分析思路:

分析客户端和服务端的性能,看是否有性能瓶颈(CPU,内存,磁盘,网络)--->CPU使用率占用一直很高且接近100%--->分析CPU占用过高的进程,发现是mysql数据库进程--->查询CPU占用高时使用的SQL语句,分析该SQL语句是不是存在慢查询问题--->最后分析SQL语句慢查询的原因(一般为使用全表查询方式,GroupBy、OrderBy排序问题)

本次测试的经验分享:

1、通过监控分析服务端的硬件性能,看是否有性能瓶颈(CPU,内存,磁盘,网络),结果:CPU使用率占用一直很高且接近100%现象,初步可定位是CPU问题。

mysql 内存利用率 过高_性能优化_03

 

2、分析CPU占用过高的进程,发现是MSQL数据库进程。

mysql 内存利用率 过高_sql_04

 

3、查询CPU占用高时使用的SQL语句,分析该SQL语句是不是存在慢查询问题。

(1)通过show variables like ‘slow_query_log%’来查看慢查询日志的路径。

mysql 内存利用率 过高_mysql 内存利用率 过高_05

 

(2)排查慢查询日志文件中的慢SQL语句

mysql 内存利用率 过高_性能优化_06

 

SELECT id FROM `WJJ_JOB_QRTZ_TRIGGER_LOG` WHERE !( (trigger_code in (0, 200) and handle_code = 0) OR (handle_code = 200) ) AND `alarm_status` = 0 ORDER BY id ASC;

4、最后分析SQL语句慢查询的原因。

使用expain命令,发现使用全表查询方式<ALL>(需使用索引)

mysql 内存利用率 过高_sql_07

 

5、性能优化。

(1)针对上面的SQL语句添加索引。

(2)如果添加了索引还是CPU占用过高,就需要优化SQL语句本身(可以考虑GroupBy、OrderBy排序问题)。