Mysql性能调优笔记(第一部分)
Posted 光荣之路
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql性能调优笔记(第一部分)相关的知识,希望对你有一定的参考价值。
吴老的《selenium webdriver 实战宝典》出版了!
项目后台用mysql存储数据,开始运行时数据量比较少,各个页面查询的性能都比较可观,所以没有关心性能的问题,然而慢慢的数据量越来越大,开始发现首页和一些查询页面的性能明显不容乐观,早上也给领导做了一次展示,其余功能实现都不错,就是查询的性能有待提高。
对于mysql调优自己没有什么经验,苦思之余想起了吴老,我是吴老光荣之路的学生,之前做dubbo的接口测试也是没有思路向吴老询问参考了他给的一些测试dubbo接口的经验,所以马上就在qq上找了吴老:
我其实很想快点解决,所以想早点定下解决方案:
1. 当我打开页面发现首页加载时间很长,用f12工具观察耗时为:
时间太长早就超过用户可以忍受的等待范围了,最耗时的请求:
Page的获取主要在等待上占用太长时间,花了26s,而首页主要的功能为从数据库中获取一系列的信息进行展示,所以初步可以推断从数据库查数据这块等待了很久。
由上面我们可以知道页面响应慢,最主要的瓶颈点跟数据库查询有很大关系,所以在吴老建议慢查询分析后,我就开启了mysql慢查询功能看看具体是哪些sql语句导致慢。
这里首先简单说下mysql慢查询开启的方法:
1. 进入mysql客户端,我们用如下命令,可以看到我们的mysql有没有开启慢查询等信息:
show variables like'log_slow_queries';
show variables like'long_query_time';
发现慢查询为off关闭状态,说明没有开启慢查询,我们要把它打开
1. 进入mysql安装路径下,找到my.ini文件(我是在本地调试,在windows机器上)
在my.ini文件的[mysqlId]下,添加如下语句
log-slow-queries="D:/mysql/log/mysql-slow.log" #慢查询sql日志
long_query_time=5 #多长时间为慢sql
1. 重启mysql服务,windows下的步骤为
a:计算机下的管理
b:点击管理后,找到服务和应用程序
c:点击服务和应用程序,进入后找到服务
d:在服务中找到MySQL服务,进行重启即可
1. 此时在去mysql中看慢查询启动状态
show variables like'log_slow_queries';
show variables like'long_query_time';
发现状态为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秒执行)进行了分析:
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左右:
1. 分析sql语句-优化只查询需要的字段
观察到我们之前界面分析中page获取时数据大小约为130多M,我只是做个简单的图表展示:展示任务失败数、总次数:
而这里的sql却将表中所有的字段都查询出来了:
增加了不必要的流量消耗和时间消耗,然后去观察sql表,发现 :
该数据表中存在一个文本字段,查询sql发现该字段存储了大量的任务异常信息,包括堆栈信息,我们查询时将这些不必要的字段也查询出来了,是不是可以去掉,于是对sql语句进行了优化,将select后面查询的内容由全表变成了:
hour(execute_date) as h , count(*)我需要的两个字段,即任务执行总数和执行时间,发现这样优化后,首页的性能有了明显的提高,在mysql工具中查询得到的响应时间很快,1w条不到1s就能查询出来:
Sql优化后,放到工程中去跑,发现首页的性能有所提高,但是还是在用户不可接受范围内,差不多需要8s才能加载出来。
(待续。。。。。)
以上是关于Mysql性能调优笔记(第一部分)的主要内容,如果未能解决你的问题,请参考以下文章
2022-02-26-Spark-46(性能调优SparkUI)