[mysql]查询截取分析-慢查询日志

慢查询日志

是什么?

  • MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阈值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。
  • long_query_time的默认值为10,意思是运行10秒以上的语句。
  • 由慢查询日志来查看哪些SQL超出了我们的最大忍耐时间值,比如一条SQL执行超过5秒钟,我们就算慢SQL,希望能收集超过5秒钟的SQL,结合之前explain进行全面分析。

如何使用?

说明

  • 默认情况下,MySQL数据库没有开启慢查询日志,需要我们手动来设置这个参数。

  • 当然,如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响。慢查询日志支持将日志记录写入文件。

查看是否开启及如何开启

Case

  • 查看慢查询日志是否开启:SHOW VARIABLES LIKE '%slow_query_log%';

  • 开启慢查询日志:SET GLOBAL slow_query_log = 1;使用该方法开启MySQL的慢查询日志只对当前数据库生效,如果MySQL重启后会失效。

  • 永久生效,需要修改配置文件

  • 修改my.cnf文件,[mysqld]下增加或修改参数,修改后重启服务器。

  •   slow_query_log = 1
      slow_query_log_file = /var/lib/mysql/xxxx-show.log #生成为文件
    

那么开启了慢查询日志后,什么样的SQL才会记录到慢查询日志里呢?

  • 这个是由参数long_query_time控制的,默认情况下long_query_time的值为10秒。
  • 命令:SHOW VARIABLES LIKE 'long_query_time%';
mysql> SHOW VARIABLES LIKE 'long_query_time%';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.00 sec)
  • 设置慢的阙值时间:set global long_query_time=3; #超过3秒才会记录
    • 修改后看不出变化:需要 重新连接/新开一个会话 才可以看到修改后的记录。
select sleep(4) #模拟复杂sql执行时间为4秒
到/var/lib/mysql/xxx.-slow.log文件看分析记录

#通过sql查看,超过阙值的记录数字
SHOW GLOBAL STATUS LIKE '%Slow_queries%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Slow_queries  | 3     |
+---------------+-------+
1 row in set (0.00 sec)

配置版本

[mysqld]
long_query_time=1

日志分析工具mysqldumpslow

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

  • 查看mysqldumpslow的帮助信息:
root@iZ2ze12qqdfkraupgjydntZ:~# 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


  • 工作参考案例
#得到返回记录集最多的10个SQL
mysqldumpslow -s r -t 10 /var/lib/mysql/xxxx.log

# 得到访问次数最多的10个SQL
mysqldumpslow -s c -t 10 /var/lib/mysql/xxxx.log
 
# 得到按照时间排序的前10条里面含有左连接的查询语句
mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/xxxx.log

# 另外建议使用这些命令时结合|和more使用,否则出现爆屏的情况
mysqldumpslow -s r -t 10 /var/lib/mysql/xxxx.log | more
posted @ 2020-09-18 22:22  HankinkK  阅读(131)  评论(0)    收藏  举报