MySQL系列之三:慢查询日志及分析

一、打开慢查询日志配置参数,统计有问题的SQL

[mysqld]  
…  
…  
slow_query_log  
log-short-format    
slow_query_log_file=/var/log/mysqld-slow-query.log
#log_slow_queries=/var/log/mysql-slow-query.log(5.5版本之后废弃)
long-query-time = 2    
#log-long-format    
#log-slow-admin-statements  
log-queries-not-using-indexes  

二、配置解释

  1. 我开启了query_log功能。
  2. 在日志查询中我使用的是log-short-format格式而不是long-format,因为这样我的mySQL日志更紧凑,要不然一天下来光统计这些日志就要耗掉G的空间了。
  3. 指明了“慢查询”日志生成的路径级文件名。
  4. 配置了对于超过2秒的查询SQL全部记录在慢查询日志中。
  5. 开启了在查询时凡是没有用到索引的SQL全部记录在慢查询日志中。

设置完慢查询日志参数,重启MySQL服务,使配置生效。

三、日志内容

日志如下,内容中各字段意思很明确,不在赘述。

/usr/sbin/mysqld, Version: 5.6.20-enterprise-commercial-advanced-log (MySQL Enterprise Server - Advanced Edition (Commercial)). started with:

Tcp port: 0  Unix socket: (null)

Time                 Id Command    Argument

/usr/sbin/mysqld, Version: 5.6.20-enterprise-commercial-advanced-log (MySQL Enterprise Server - Advanced Edition (Commercial)). started with:

Tcp port: 0  Unix socket: (null)

Time                 Id Command    Argument

# Time: 160616 17:24:35

# User@Host: root[root] @ localhost []  Id:     5

# Query_time: 3.002615  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0

SET timestamp=1466069075;

select sleep(3);

生产环境中,如果要手工分析日志,查找、分析SQL,显然是个体力活,MySQL提供了日志分析工具mysqldumpslow。

四、日志分析工具

mysqldumpslow闪亮登场,具体使用方法大家可以参考帮助:
mysqldumpslow --help

[root@DB-Server ~]# mysqldumpslow --help

Usage: mysqldumpslow [ OPTS... ] [ LOGS... ]



Parse and summarize the MySQL slow query log. Options are



  --verbose    verbose

  --debug      debug

  --help       write this text to standard output



  -v           verbose

  -d           debug

  -s ORDER     what to sort by (al, at, ar, c, l, r, t), 'at' is default

                al: average lock time

                ar: average rows sent

                at: average query time

                 c: count

                 l: lock time

                 r: rows sent

                 t: query time  

  -r           reverse the sort order (largest last instead of first)

  -t NUM       just show the top n queries

  -a           don't abstract all numbers to N and strings to 'S'

  -n NUM       abstract numbers with at least n digits within names

  -g PATTERN   grep: only consider stmts that include this string

  -h HOSTNAME  hostname of db server for *-slow.log filename (can be wildcard),

               default is '*', i.e. match all

  -i NAME      name of server instance (if using mysql.server startup script)

  -l           don't subtract lock time from total time

部分说明:
-s, 是表示按照何种方式排序,

c: 访问计数

l: 锁定时间

r: 返回记录

t: 查询时间

al:平均锁定时间

ar:平均返回记录数

at:平均查询时间

-t, 是top n的意思,即为返回前面多少条的数据;

-g, 后边可以写一个正则匹配模式,大小写不敏感的;

一些例子:

得到返回记录集最多的10个SQL。

mysqldumpslow -s r -t 10 /database/mysql/mysql06_slow.log

得到访问次数最多的10个SQL

mysqldumpslow -s c -t 10 /database/mysql/mysql06_slow.log

得到按照时间排序的前10条里面含有左连接的查询语句。

mysqldumpslow -s t -t 10 -g “left join” /database/mysql/mysql06_slow.log

另外建议在使用这些命令时结合 | 和more 使用 ,否则有可能出现刷屏的情况。

mysqldumpslow -s r -t 20 /mysqldata/mysql/mysql06-slow.log | more

你可能感兴趣的:(MySQL)