前言
想记录一些mysql性能优化,但是因为空闲时间以及相关知识点怕记录的过于片面,不够全面,所以一直耽搁了;下面文章是在自己学习服务器上运行的,与实际工作内容无关;
mysql官方有很多关于慢查询的文章,我个人还是首推去官网阅读学习;
mysql官网一些相关慢查询日志的文章
一般情况下,如果不需要进行调优,建议关闭,不要开启慢查询,因为开启慢日志功能在一定程度上会影响到数据库的性能,在完成 SQL 优化后应当及时关闭这个功能。特别是对于存在大量并发事务的 OLTP 系统,开启慢日志功能对系统整体性能来讲将是一个沉重的负担,特别是在某些索引失效或者数据表存储物理变更时将会导致恶性循环,严重时可能会导致系统崩溃。
慢查询介绍
- 慢查询:执行很慢的一些查询。
- MySQL的慢查询日志是MySQL提供的一种日志记录,当执行SQL超过long_query_time参数设定的时间阈值(默认10s)时,就被认为是慢查询,则会被记录到慢查询日志中。
- 慢查询日志默认是不开启的。如果需要优化SQL语句,就可以开启这个功能,它可以让你很容易地知道哪些语句是需要优化的。
开启慢查询
默认情况下,MySQL数据库没有开启慢查询日志,手动来设置这个参数。
#查看是否开启慢查询,以及慢查询日志存放路径
SHOW VARIABLES LIKE '%slow_query_log%';
#开启慢查询
set global slow_query_log=1;
#关闭慢查询
set global slow_query_log=0;
#查看是否开启记录未使用索引sql慢查询日志,默认也是关闭
show variables like 'log_queries_not_using_indexes';
#开启记录未使用索引sql慢查询日志
set global log_queries_not_using_indexes=1;
#关闭记录未使用索引sql慢查询日志
set global log_queries_not_using_indexes=0;
设置慢查询时间阈值
#查看慢查询时间阈值(默认10s)
show variables like 'long_query_time';
#设置慢查询时间阈值(我设置的是3秒)
set global long_query_time= 3;
关于使用set global long_query_time修改慢查询时间不生效问题
这边有个小问题,如果你使用了
set global long_query_time = ?
修改了慢查询日志,再马上用show variables like 'long_query_time'
查询,会发现结果还是默认的10秒,而实际上long_query_time已经被我们修改了,但你查询还是没刷新的旧值,这时你关闭该数据库连接,进行重连,再查询会发现long_query_time已经被改成功了;
不重连数据库的话,也可以通过换成:show global variables like 'long_query_time';
语句进行查询最新值;
上面一系列操作并不是永久开启慢查询日志,如果要永久生效,就必须修改配置文件my.cnf
#开启慢查询日志
slow_query_log=1
#指定慢查询日志生成文件所在路径
slow_query_log_file=/var/lib/mysql/zsl-slow.log
#设置慢查询时间阈值
long_query_time=3
#开启记录未使用索引sql慢查询日志
log_queries_not_using_indexes=1
#日志输出方式为文件
log_output=FILE
定位慢查询
性能优化不能张口就来,还是要结合实际问题去分析的,所以我们首先要看看mysql从启动到现在,mysql数据库的一些运行状态,例如:一共执行了多少次select/update/delete…
flush status;
#从启动到现在执行select次数
show global status like 'com_select';
#当前session里执行select次数,session可以不加
show session status like 'com_select';
#从启动到现在执行update次数
show global status like 'com_update';
#当前session里执行update次数,session可以不加
show session status like 'com_update';
#从启动到现在执行delete次数
show global status like 'com_delete';
#当前session里执行delete次数,session可以不加
show session status like 'com_delete';
#从开启慢查询日志开始到现在有多少条慢查询记录
show global status like '%slow_queries%';
查看一下有多少条慢查询记录
慢查询日志分析
- 慢查询日志分析有很多种方式,你可以打开慢查询日志,使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的慢查询语句或是结构的性能瓶颈;Explain分析在我看来,应该作为重点,所以会单独在一篇文章中记录;
- 你也可以使用mysqldumpslow分析慢查询日志;
- 你也可以下载第三方工具mysqlsla进行分析慢查询日志;
- 网外在线分析工具(日志文件不能超过8M):Analyze Your Slow Query Log
关于mysqldumpslow工具
日志分析工具mysqldumpslow,mysql官方自带的,只要安装了mysql就可以使用它,可以用来帮助我们分析慢日志文件;
mysql官方也有关于mysqldumpslow工具的介绍和使用引导文章
mysqldumpslow使用
mysqldumpslow可以通过命令来使用,例如:
#指定慢查询日志进行分析
#查询执行时间最长的前10
mysqldumpslow -s t -a -t 10 /var/lib/mysql/zsl-slow.log
参数选项 | 使用说明 |
-a | 显示具体的数字和字符信息,而不是用N或者S代替 |
-n | 将数字抽象显示为指定的数字个数 |
–debug | 指定debug模式运行 |
-g | 指定大小写不敏感的正则表达 |
–help | 显示帮助信息 |
-h | 指定MySQL主机名称用于选择慢查询日志(日志文件名称,缺省为*-slow.log) |
-i | 指定服务器示例名称用于选择慢查询日志 |
-l | 显示总时间(包括lock锁定时间) |
-r | 逆序排序 |
-s | 指定排序方式 |
-t | 只显示指定数量的结果内容 |
–verbose | Verbose模式 |
使用-s指定排序方式,主要有如下四种方式:
- l: 按锁定时间排序
- r: 按结果行数排序
- t: 按查询时间排序
- c:按执行次数排序
a为平均,与上述参数结合可形成新的排序方式:
- at:按平均查询时间排序(默认排序方式)
- al:按平均锁定时间排序
- ar:按平局结果行数排序
-s 是表示按照何种方式排序,后面可以带如下排序方式
c: 访问次数 l: 锁定时间
r: 返回记录的行数
t: 查询时间
al:平均锁定时间
ar:平均返回记录的行数 at:平均查询时间
-t 是top n的意思,即为返回前面多少条的数据
-g 后边可以写一个正则匹配模式,大小写不敏感的
举例说明:
#返回执行次数最高的前10条sql
mysqldumpslow -s c -a -t 10 /var/lib/mysql/zsl-slow.log
#返回结果行数最多的前10条sql
mysqldumpslow -s r -a -t 10 /var/lib/mysql/zsl-slow.log
#返回执行时间最长的前10条sql
mysqldumpslow -s t -a -t 10 /var/lib/mysql/zsl-slow.log
分析后结果参数解读
- Count:代表这个 SQL 语句执行了多少次
- Time:代表执行的时间,括号是累计时间
- Lock:表示锁定的时间,括号是累计时间
- Rows:表示返回的记录数,括号是累计记录数