Mysql性能调优笔记(第一部分)

Posted 光荣之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql性能调优笔记(第一部分)相关的知识,希望对你有一定的参考价值。

吴老的《selenium webdriver 实战宝典》出版了!


项目后台用mysql存储数据,开始运行时数据量比较少,各个页面查询的性能都比较可观,所以没有关心性能的问题,然而慢慢的数据量越来越大,开始发现首页和一些查询页面的性能明显不容乐观,早上也给领导做了一次展示,其余功能实现都不错,就是查询的性能有待提高。

对于mysql调优自己没有什么经验,苦思之余想起了吴老,我是吴老光荣之路的学生,之前做dubbo的接口测试也是没有思路向吴老询问参考了他给的一些测试dubbo接口的经验,所以马上就在qq上找了吴老:

   Mysql性能调优笔记(第一部分)

我其实很想快点解决,所以想早点定下解决方案:

Mysql性能调优笔记(第一部分)

1.  当我打开页面发现首页加载时间很长,用f12工具观察耗时为:

时间太长早就超过用户可以忍受的等待范围了,最耗时的请求:

Mysql性能调优笔记(第一部分)

Page的获取主要在等待上占用太长时间,花了26s,而首页主要的功能为从数据库中获取一系列的信息进行展示,所以初步可以推断从数据库查数据这块等待了很久。

Mysql性能调优笔记(第一部分)

由上面我们可以知道页面响应慢,最主要的瓶颈点跟数据库查询有很大关系,所以在吴老建议慢查询分析后,我就开启了mysql慢查询功能看看具体是哪些sql语句导致慢。

这里首先简单说下mysql慢查询开启的方法:

1.  进入mysql客户端,我们用如下命令,可以看到我们的mysql有没有开启慢查询等信息:

show variables like'log_slow_queries';

show variables like'long_query_time';

Mysql性能调优笔记(第一部分)

发现慢查询为off关闭状态,说明没有开启慢查询,我们要把它打开

 

1.  进入mysql安装路径下,找到my.ini文件(我是在本地调试,在windows机器上)

my.ini文件的[mysqlId]下,添加如下语句

log-slow-queries="D:/mysql/log/mysql-slow.log"  #慢查询sql日志

long_query_time=5  #多长时间为慢sql

Mysql性能调优笔记(第一部分)

1.  重启mysql服务,windows下的步骤为

a:计算机下的管理

Mysql性能调优笔记(第一部分)

b:点击管理后,找到服务和应用程序

Mysql性能调优笔记(第一部分)

c:点击服务和应用程序,进入后找到服务

Mysql性能调优笔记(第一部分)

d:在服务中找到MySQL服务,进行重启即可

Mysql性能调优笔记(第一部分)

1.  此时在去mysql中看慢查询启动状态

show variables like'log_slow_queries';

show variables like'long_query_time';

Mysql性能调优笔记(第一部分)

发现状态为ON,表示已经启动慢查询。

 

1.  我们已经打开了慢查询,此时我们进行慢sql收集

此时我们点击首页页面,待页面刷新成功后,此时进入sql慢查询日志目录下(我们在上面配置的是log-slow-queries="D:/mysql/log/mysql-slow.log"),找到文件mysql-slow.log,点击f5刷新一下,便能看到log中存入了数据

 

2.  此时我们点击首页页面,待页面刷新成功后,此时进入sql慢查询日志目录下,找到文件mysql-slow.log,点击f5刷新一下,便能看到log中存入了数据

选取了耗时最长的sql(耗时14秒执行)进行了分析:

Mysql性能调优笔记(第一部分)


Sql语句为:

select this_.id as id1_3_0_,this_.create_by as create17_3_0_, this_.create_date as create2_3_0_,this_.del_flag as del3_3_0_, this_.remarks as remarks4_3_0_, this_.update_by asupdate18_3_0_, this_.update_date as update5_3_0_, this_.case_result ascase6_3_0_, this_.case_type as case7_3_0_, this_.cost_time as cost8_3_0_,this_.ctah_auto_test_id as ctah9_3_0_, this_.execute_by as execute10_3_0_,this_.execute_date as execute11_3_0_, this_.ip as ip12_3_0_, this_.name asname13_3_0_, this_.port as port14_3_0_, this_.status as status15_3_0_,this_.vs_node as vs16_3_0_ from ctah_auto_result this_ where this_.del_flag='0'and this_.case_type='pollScript' and this_.status='1' order bythis_.execute_date desc;

将这条sql语句直接放入mysql工具中执行,发现耗时在14s左右:

Mysql性能调优笔记(第一部分)

1.  分析sql语句-优化只查询需要的字段

观察到我们之前界面分析中page获取时数据大小约为130M,我只是做个简单的图表展示:展示任务失败数、总次数:

Mysql性能调优笔记(第一部分)

而这里的sql却将表中所有的字段都查询出来了:

Mysql性能调优笔记(第一部分)

增加了不必要的流量消耗和时间消耗,然后去观察sql表,发现

Mysql性能调优笔记(第一部分)

该数据表中存在一个文本字段,查询sql发现该字段存储了大量的任务异常信息,包括堆栈信息,我们查询时将这些不必要的字段也查询出来了,是不是可以去掉,于是对sql语句进行了优化,将select后面查询的内容由全表变成了:

hour(execute_date) as h , count(*)我需要的两个字段,即任务执行总数和执行时间,发现这样优化后,首页的性能有了明显的提高,在mysql工具中查询得到的响应时间很快,1w条不到1s就能查询出来:


Sql优化后,放到工程中去跑,发现首页的性能有所提高,但是还是在用户不可接受范围内,差不多需要8s才能加载出来。



(待续。。。。。)



以上是关于Mysql性能调优笔记(第一部分)的主要内容,如果未能解决你的问题,请参考以下文章

mysql性能调优与架构设计笔记

2022-02-26-Spark-46(性能调优SparkUI)

部门挖来了月薪80K的京东大佬,总结了堪称完美的SQL调优笔记

linux性能调优总结

全栈必备——MySQL性能调优

实现MySQL读写分离,MySQL性能调优