说明

  • Mysql的查询讯日志是Mysql提供的一种日志记录,它用来记录在Mysql中响应时间超过阈值的语句
  • 具体指运行时间超过long_query_time值得SQL,则会被记录到慢查询日志中。long_query_time的默认为10,意识是运行10秒以上的语句。
  • 由它来看那些SQL语句超出了我们的最大忍耐值,比如一条SQL执行超过了5秒,我们就算慢查询,我们就可以结合Explain进行分析。

查看是否开启及如何开启

默认Mysql没有开启慢查询,需要我们说动设置这个参数。当然,如果不是调优需要的话,一般不建议开启该参数,因为开启慢查询日志会或多或少带来一定的性能影响。慢查询日志支持将日志写入文件。

进入mysql终端查看是否开启(我这里都是自己改过的)

  1. mysql> show variables like '%slow_query_log%';
  2. +---------------------+----------------------------+
  3. | Variable_name | Value |
  4. +---------------------+----------------------------+
  5. | slow_query_log | ON |
  6. | slow_query_log_file | /data/mysql/mysql-slow.log |
  7. +---------------------+----------------------------+

上面查询结果第一行,这里是开启的,第二行是默认查询路径文件名。

  1. mysql> set global slow_query_log = 0|1; //设置开启或者关闭,0为关闭,1为开启

如果使用set global slow_query_log 命令开启慢查询日志,只对当前数据库生效,如果Mysql重启后则会失效。

补充:如果通过终端命令设定的话,再查询是看不到修改结果的,需要新开启一个窗口查看即可。

如果要永久生效,必须修改my.cnf配置文件(其他系统变量也是如此),

修改my.cnf文件,[mysqld]下增加和修改参数slow_query_log和slow_query_log_file后,然后重启MySQL服务器,也即将如下两行配置进my.cnf文件
slow_query_log = 1

slow_query_log_file = /data/mysql/mysql-slow.log

  1. [mysqld]
  2. slow_query_log = 1
  3. long_query_time = 1
  4. slow_query_log_file = /data/mysql/mysql-slow.log

关于慢查询的参数slow_query_log_file,它指定慢查询日志文件的存放路径,系统默认会给一个缺省的host_name_show.log(如果没有指定参数slow_query_log_file的话)。

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

  • 这个是由参数long_query_time控制,默认情况下long_query_time的值是10秒。
  • 命令SHOW VARIABLES LIKE 'long_query_time';
  1. mysql> show variables like 'long_query_time';
  2. +-----------------+----------+
  3. | Variable_name | Value |
  4. +-----------------+----------+
  5. | long_query_time | 10.00000 |
  6. +-----------------+----------+

可以使用命令修改,也可以在my.cnf参数里面修改,修改完记得习惯性重启服务。还是那句话,不建议生产环境开启。

  1. mysql> show variables like 'long_query_time';
  2. +-----------------+----------+
  3. | Variable_name | Value |
  4. +-----------------+----------+
  5. | long_query_time | 1.000000 |
  6. +-----------------+----------+

假如SQL运行时间刚好等于long_query_time的情况,并不会被记录下来,也就是说,在Mysql源码里是判断大于long_query_time,而非大于等于。

Case

  • 查看当前多少秒算慢:SHOW VARIABLES LIKE 'long_query_time%';
  • 设置慢的阙值时间:set global long_query_tim
  • 为什么设置后看不出变化:
  1. 需要重新连接或新开一个回话才能看到修改值; SHOW VARIABLES LIKE 'long_query_time%';
  2. SHOW GLOBAL VARIABLES LIKE 'long_query_time%';

  • 记录慢SQL并后续分析:select sleep(4);

查看慢查询日志文件

  1. # cat /data/mysql/mysql-slow.log
  2. #
  3. # select sleep(5);
  4. # Time: 2018-01-20T18:10:24.443517Z
  5. # User@Host: root[root] @ localhost [] Id: 3
  6. # Query_time: 5.000564 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0
  7. use test_db; #使用的数据库
  8. SET timestamp=1524276624; #时间戳
  9. select sleep(5); #问题SQL

以上信息包括实际查询时间5.000564秒,时间戳timestamp=1524276624,还有库test_db,出问题的SQL。

  • 查看当前系统中多少条满记录:show global status like '%Slow_queries%';
  1. mysql> show global status like '%Slow_queries%';
  2. +---------------+-------+
  3. | Variable_name | Value |
  4. +---------------+-------+
  5. | Slow_queries | 1 |
  6. +---------------+-------+
  7. 1 row in set (0.03 sec)

可以作为系统健康检查度来查询。(什么意思:如果系统里面充满了大量的慢SQL,都超过阙值,这时系统就需要及时优化)

配置版

  1. show_query_log = 1;
  2. show_query_log_file=/var/lib/mysql/mysql_slow.log
  3. log_query_time=3;
  4. log_output=FILE

mysqldumpslow用法讲解

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

上面测试的慢查询SQL只有一条,假如在实际的生产环境中,慢查询SQL远远高于测试的数量,十几条甚至几十条,假如几条慢查询出现的频率很高,我们能做到根据轻重优先级来分析并排除那是不是更好?那么就用到了mysqldumpslow

  1. [root@lig mysql]# mysqldumpslow --help ----------------------------------------------------//执行命令
  2. Usage: mysqldumpslow [ OPTS... ] [ LOGS... ]
  3. Parse and summarize the MySQL slow query log. Options are
  4. --verbose verbose
  5. --debug debug
  6. --help write this text to standard output
  7. -v verbose
  8. -d debug
  9. -s ORDER what to sort by (al, at, ar, c, l, r, t), 'at' is default
  10. al: average lock time
  11. ar: average rows sent
  12. at: average query time
  13. c: count
  14. l: lock time
  15. r: rows sent
  16. t: query time
  17. -r reverse the sort order (largest last instead of first)
  18. -t NUM just show the top n queries
  19. -a don't abstract all numbers to N and strings to 'S'
  20. -n NUM abstract numbers with at least n digits within names
  21. -g PATTERN grep: only consider stmts that include this string
  22. -h HOSTNAME hostname of db server for *-slow.log filename (can be wildcard),
  23. default is '*', i.e. match all
  24. -i NAME name of server instance (if using mysql.server startup script)
  25. -l don't subtract lock time from total time

s:是表示按照何种方式排序

c:访问次数

i:锁定时间

r:返回记录

t:查询时间

al:平均锁定时间

ar:平均返回记录数

at:平均查询时间

t:即为返回前面多少条数据

g:后边搭配一个正则匹配模式,大小写不敏感

  1. mysqldumpslow -s r -t 10 /data/mysql/mysql-slow.log //得到返回记录集最多的10个SQL
  2. mysqldumpslow -s c -t 10 /data/mysql/mysql-slow.log //得到访问次数最多的10个SQL
  3. mysqldumpslow -s t -t 10 -g "left join" /data/mysql/mysql-slow.log //得到按照时间排序的前10条里面含有做了连接的查询SQL
  4. mysqldumpslow -s r -t 10 /data/mysql/mysql-slow.log | more //另外建议在使用这些命令时结合|

MySQL慢查询开启、日志分析(转)的更多相关文章

  1. mysql慢查询开启及分析方法

    最近服务维护的公司的DB服务器,总是会出现问题,感觉需要优化一下了,登陆上去,发现慢查询日志都没有开,真是惭愧, 故果断加上慢查询日志, 经过分析sql记录,发现问题很多,开发人员很多没有对sql优化 ...

  2. mysql 慢查询开启

    相关博客: linux下开启mysql慢查询,分析查询语句 开启方法: 方法一:使用命令开启慢查询开启 mysql> show variables like "%long%" ...

  3. MySQL慢查询 - 开启慢查询

    一.简介 开启慢查询日志,可以让MySQL记录下查询超过指定时间的语句,通过定位分析性能的瓶颈,才能更好的优化数据库系统的性能. 二.参数说明 slow_query_log 慢查询开启状态 slow_ ...

  4. MySQL慢查询—开启慢查询

    ###一.简介 开启慢查询日志,可以让MySQL记录下查询超过指定时间的语句,通过定位分析性能的瓶颈,才能更好的优化数据库系统的性能. ###二.参数说明 slow_query_log 慢查询开启状态 ...

  5. Mysql慢查询开启和查看 ,存储过程批量插入1000万条记录进行慢查询测试

    首先登陆进入Mysql命令行  执行sql      show variables like 'slow_query%';  结果为OFF 说明还未开启慢查询 执行sql     show varia ...

  6. MySQL Slow Log慢日志分析【转】

    如果你的MySQL出现了性能问题,第一个需要“诊断”的就是slow log(慢日志)了. slow log文件很小,使用more less等命令就足够了.如果slow log很大怎么办?这里介绍MyS ...

  7. MySQL慢查询Explain Plan分析

    Explain Plan 执行计划,包含了一个SELECT(后续版本支持UPDATE等语句)的执行 主要字段 id 编号,从1开始,执行的时候从大到小,相同编号从上到下依次执行. Select_typ ...

  8. mysql服务器查询慢原因分析方法

    mysql数据库在查询的时候会出现查询结果很慢,超过1秒,项目中需要找出执行慢的sql进行优化,应该怎么找呢,mysql数据库提供了一个很好的方法,如下: mysql5.0以上的版本可以支持将执行比较 ...

  9. 慢查询日志分析(mysql)

    开启慢查询日志之后,慢查询sql会被存到数据库系统表mysql.slow_log或是文件中,可参考.有两个工具可以帮助我们分析输出报告,分别是mysqldumpslow和pt-query-digest ...

随机推荐

  1. Python 疑难问题:[] 与 list() 哪个快?为什么快?快多少呢?

    本文出自"Python为什么"系列,请查看全部文章 在日常使用 Python 时,我们经常需要创建一个列表,相信大家都很熟练了吧? # 方法一:使用成对的方括号语法 list_a ...

  2. 多测师讲解selenium _滚动条定位_高级讲师肖sir

    from selenium import webdriverfrom time import sleepdrvier=webdriver.Chrome()drvier.get('http://www. ...

  3. day08 Pyhton学习

    一.昨日内容回顾 .1.基础部分的补充 join()  把列表变成字符串, 拼接 split() 切割 删除: 列表和字典不能在循环的时候进行删除. 把要删除的内容记录在一个新列表中,然后循环新列表, ...

  4. JS中实现Trim(),TrimStart(),TrimEnd() 的方法

    //去除字符串头尾空格或指定字符 String.prototype.Trim = function (c) { if (c == null || c == "") { var st ...

  5. pytest文档45-allure添加环境配置(environment)

    前言 在 allure 报告首页 ENVIRONMENT 显示 'There are no environment variables' 没有环境变量的配置信息. 环境变量配置可以添加报告相关的配置参 ...

  6. linux学习(二)--setup.s

    执行过bootsect.s,加载了所有系统代码之后,开始向32位模式转变,为main函数的调用做准备,同样,附上图往下看 1 INITSEG = 0x9000 ! we move boot here ...

  7. 【Azure Redis 缓存 Azure Cache For Redis】如何设置让Azure Redis中的RDB文件暂留更久(如7天)

    问题描述 Azure Redis和所有的Redis服务一样,可以让你保留存储在Redis中的数据.以防万一在Redis服务器出现故障的时候能尽可能小的减少数据的损失.在Azure Redis服务中,默 ...

  8. python web自动化上传文件工具

    工具下载地址:链接:https://pan.baidu.com/s/1cHdNHW 密码:56bp说明:1.WinSpy-1.0.2.7z解压即可.2.pywin32的exe程序,根据自己安装的pyt ...

  9. Docker学习笔记之-通过Xshell连接 CentOS服务

    上一节演示如何在虚拟机中安装 CentOS服务,Docker学习笔记之-在虚拟机VM上安装CentOS 7.8 本节主要演示如何通过 Xshell软件链接CentOS服务,本例以虚拟机作为演示,直接在 ...

  10. Ⅲ Dynamic Programming

    Dictum:  A man who is willing to be a slave, who does not know the power of freedom. -- Beck 动态规划(Dy ...