关于MySQL的慢查询日志<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
在进行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,后边可以写一个正则匹配模式,大小写不敏感
-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语句
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,定时去分析过滤慢查询日志,这样工作就轻松多了。
转载于:https://blog.51cto.com/samyubw/324531