有关 mysql 慢查询日志

发布时间:2020-04-30编辑:脚本学堂
在进行SQL优化时,要重点找出执行速度较慢或占系统资源较多的语句,通过开启MySQL的慢查询日志可以做到这一点。

(1)、如何开启mysql的慢查询日志
在配置文件my.cnf中添加以下参数:
 

复制代码 代码示例:
log-slow-queries=/opt/log/slow.log
long_query_time=2
 

注意参数不要写错了,否则慢查询日志是开启不了的.

参数解释:
log-slow-queries
记录慢查询的位置和文件名称,注意mysql用户在/opt/log下有可写权限才行。如果后面的值为空,则MySQL Server会给慢查询日志赋予主机名,并被放在mysql默认的数据目录下。

long_query_time
执行时间的上限,即超过这个设置时间的SQL定义为慢查询并被记录,默认值为10s。

上述两个参数加入后,要重启MySQL Server才会生效。

(2)、参数log-queries-not-using-indexes
如果设置了参数log-queries-not-using-indexes,那么所有没有使用索引的查询也将被记录。在文件my.cnf或my.ini中加入这一行可以记录这些查询.这是一个有用的日志。它对于性能的影响不大(假设所有查询都很快),并且强调了那些最需要注意的查询(丢失了索引或索引没有得到最佳应用)

(3)、慢查询日志分析工具mysqldumpslow
Mysqldumpslow主要的参数有以下几个:
-s:列出SQL的排列顺序标准,后面可以有这么几个:
t  总执行时间
c  执行的总次数
l  lock的时间
r  返回的记录数
-t,是top n的意思,即为返回前面多少条的SQL
-g,后边可以写一个正则匹配模式,大小写不敏感
-r,该工具默认的排序顺序是降序,用-r表示升序排序
-a,  don't abstract all numbers to N and strings to 'S' --- 默认情况下,在where语句中等号右边的数字和字符串是被抽象成N或者S的.这非常必要.因为我们要分析的是一类SQL,找出它们的共性来分析,而不是具体的针对某一条sql语句.
 
例子:
 

复制代码 代码示例:
mysqldumpslow -s c -t 20 localhost-slow.log > result.sql
 

返回访问次数最多的20个SQL语句
 

复制代码 代码示例:
mysqldumpslow -s r -t 20 localhost-slow.log > result.sql
 

返回记录集最多的20个SQL语句> result.sql
 

复制代码 代码示例:
mysqldumpslow -t 10 -s t -g “left join” localhost-slow.log
 

这个是按照查询时间返回前10条里面含有左连接的SQL语句
 
慢查询分析是个长期工作,即便系统长时间没有引入新的SQL查询,也可能由于不断更新数据使得数据分布特征发生变化,从而导致执行计划发生变化,进而产生慢查询。
可以编写一定的shell,定时去分析过滤慢查询日志。