MySQL高级知识(十)——慢查询日志

MySQL高级知识(十)——慢查询日志

    • 1. 慢查询是什么
    • 2. 如何开启慢查询
    • 3. 慢查询相关参数
      • 3.1. 查看慢查询的阈值时间:
      • 3.2. 设置long_query_time的值:
      • 3.3. 记录慢查询sql的数码
    • 4. 日志分析工具mysqliumpslow
      • 4.1. 查看帮助信息
      • 4.2. 工作常用参考

此博客的内容主要来源于尚硅谷的视频中,在此记录,以备以后自己查看。

1. 慢查询是什么

  • MySQL的慢查询日志是MySQL提供的一种日志记录,他用来记录在MySQL中响应时间啊你超过阀值的语句。

  • 具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为10,意思是运行10秒以上的语句将被记录下来。

  • 由他来查看哪些SQL超出我们的最大忍耐时间值,比如一条sql执行超过5秒,我们就算慢SQL,希望能收集超过5秒的sql,结合之前的explain进行全面分析。

2. 如何开启慢查询

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

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

  • 查看慢查询日志是否开启

show variables like '%slow_query_log%';

MySQL高级知识(十)——慢查询日志_第1张图片
如图:Value的值为OFF表示慢查询日志关闭,ON为开启。

  • 使用如下命令开启慢查询日志
set global slow_query_log=1;

注意:该命令开启慢查询日志只对当前数据库生效,MySQL重启失效,如果要配置长期有效,请在my.cnf中进行配置。

3. 慢查询相关参数

3.1. 查看慢查询的阈值时间:

show variables like '%long_query_time%'; 

注意:

  • 该值默认情况下为10秒;

  • 假如sql语句的运行时间正好等于long_query_time时候,sql语句并不会被记录下来,因为判断慢查询是sql的执行时间大于long_query_time,而不是大于等于。

3.2. 设置long_query_time的值:

set global long_query_time=3;

注意:当设置long_query_time值后,查看其值并没有变化,解决方法:

  • 关闭当前连接,重新开一个新的连接
  • 使用如下命令:
show global variables like '%long_query_time%'; 
#或者
set session long_query_time = 1;

3.3. 记录慢查询sql的数码

show global status like '%Slow_queries%';

MySQL高级知识(十)——慢查询日志_第2张图片

MySQL高级知识(十)——慢查询日志_第3张图片
从图中可以看出select sleep(15)语句。

4. 日志分析工具mysqliumpslow

4.1. 查看帮助信息

  • -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

4.2. 工作常用参考

  • 得到返回记录集最多的10个SQL
mysqldumpslow -s r -t 10 /var/lib/mysql/atguigu-slow.log
  • 得到访问次数最多的10个SQL
mysqldumpslow -s c -t 10 /var/lib/mysql/atguigu-slow.log
  • 得到按照时间排序的前10条里面含有左连接的查询语句
mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/atguigu-slow.log
  • 另外建议在使用这些命令时结合 | 和more 使用 ,否则有可能出现爆屏情况
mysqldumpslow -s r -t 10 /var/lib/mysql/atguigu-slow.log | more

你可能感兴趣的:(MySQL)