之前写了一篇“MySQL慢查询日志总结“,总结了一些MySQL慢查询日志常用的相关知识,这里总结一下在工作当中遇到关于MySQL慢查询日志的相关细节问题,有些是释疑或自己有疑惑,自己测试验证、解惑方面的知识。此篇只是总结个人的一些经验,不足之处,敬请指正!

1: 为什么在慢查询日志里面出现Query_time小于long_query_time阀值的SQL语句呢?

例如,如下截图,long_query_time=5, 但是Query_time小于1秒的SQL都记录到慢查询日志当中了。

相信有些人遇到这个问题的时候觉得很奇怪,其实这个不是bug,而是你设置了系统变量log_queries_not_using_indexes ,这个系统变量开启后,

会将那些未使用索引的SQL也被记录到慢查询日志中,另外,full index scan的SQL也会被记录到慢查询日志。所以,当满足这些条件的SQL,即

使Query_time时间小于long_query_time的值,也会被记录到慢查询日志。

2: 使用日志分析工具mysqldumpslow分析有些日志非常慢,如何加快?

mysqldumpslow -s t -t 10 /var/lib/mysql/MyDB-slow.log

1: 出现这种情况是因为慢查询日志变得很大(个人遇到的案例,慢查询日志就有2G多了),所以,需要每天或每周切分慢查询日志。设置一个Crontab作业即可。

/var/lib/mysql/DB-Server-slow.log.20181112

/var/lib/mysql/DB-Server-slow.log.20181113

/var/lib/mysql/DB-Server-slow.log.20181114

/var/lib/mysql/DB-Server-slow.log.20181115

2: 开启了系统变量log_queries_not_using_indexes后,如果系统设计糟糕,未使用索引的SQL很多,那么这一类的日志可能会有很多,所以还有个特别的开关log_throttle_queries_not_using_indexes用于限制每分钟输出未使用索引的日志数量。

3:mysqldumpslow的生成报告中的Count、 Time、 Lock、Rows代表具体意思。

mysqldumpslow -s c -t 10 /var/lib/mysql/MyDB-slow.log  使用mysqldumpslow分析慢查询日志分析获取访问次数最多的10个SQL。

Count :        表示这个SQL总共执行了195674次(慢查询日志中出现的次数)

Time            表示执行时间,后面括号里面的38s 表示这个SQL语句累计的执行耗费时间为38秒。其实就是单次执行的时间和总共执行消耗的时间的区别。

Lock            表示锁定时间,后面括号里面表示这些SQL累计的锁定时间为48s

Rows            表示返回的记录数,括号里面表示所有SQL语句累计返回记录数

然后我们看看慢查询日志的相关信息:

# Time: 2018-11-15T01:43:51.338167Z

这个表示日志记录的时间,确切的说是SQL执行完的时间点。注意这个时间有可能跟系统当前时间不一致,它可能是UTC时间。这个要看系统变量log_timestamps是UTC还是system。

mysql> show variables like 'log_timestamps';

+----------------+-------+

| Variable_name  | Value |

+----------------+-------+

| log_timestamps | UTC   |

+----------------+-------+

1 row in set (0.01 sec)

 

mysql> set global log_timestamps=system;

Query OK, 0 rows affected (0.00 sec)

# User@Host: xxx[xxx] @  [xxx.xxx.xxx.xxx]  Id: 23781

客户端的账户信息,两个用户名(第一个是授权账户,第二个为登录账户),客户端IP地址,还有mysqld的线程ID。

# Query_time: 16.480118  Lock_time: 0.000239 Rows_sent: 1  Rows_examined: 348011

查询执行的信息,包括查询时长,锁持有时长,返回客户端的行数,优化器扫描行数。通常需要优化的就是最后一个内容,尽量减少SQL语句扫描的数据行数

#use xxx;

#SET timestamp=1542246231;

这个是时间戳,你可以将其转换为时间格式(注意时区),如下所示:

[root@mylnx02 ~]# date -d @1542246231

Thu Nov 15 09:43:51 CST 2018

[root@DB-Server ~]# date -d @1542246231

Wed Nov 14 20:43:51 EST 2018

4: 如何分析慢查询日志一段时间内的数据呢?

mysqldumpslow这款工具没有提供相关参数分析某个日期范围内的慢查询日志,也就是说没法提供精细的搜索、分析。如果要分析某段时间内的慢查询日志可以使用工具pt-query-digest

如果实在需要使用mysqldumpslow分析某段时间内的慢查询SQL,可以借助awk命令的帮助。如下样例所示

#取出一天时间的慢查询日志

# awk '/# Time: 2018-11-14/,/# Time: 2018-11-15/' DB-Server-slow.log > DB-Server-slow.log.20181114

#取出2018-11-14号4点到6点之间两个小时的数据

#awk '/# Time: 2018-11-14T04/,/# Time: 2018-11-14T06/' DB-Server-slow.log > slow_04_06.log

5: 关于慢查询日志中query_time和lock_time的关系。

只有当一个SQL的执行时间(不包括锁等待的时间 lock_time)>long_query_time的时候,才会判定为慢查询SQL;但是判定为慢查询SQL之后,输出的Query_time包括了(执行时间+锁等待时间),并且也会输出Lock_time时间。当一个SQL的执行时间(排除lock_time)小于long_query_time的时候(即使他锁等待超过了很久),也不会记录到慢查询日志当中的。

6:  mysqldumpslow相关参数的详细信息

#  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  排序方式,at是默认方式

                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  

               #只显示前n个查询

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

               #根据服务器MySQL实例名称选择慢查询日志。

  -l           don't subtract lock time from total time  

               #不要从总时间减去锁定时间

7:  系统变量Slow_queries会统计慢查询出现的次数。

mysql>  show global status like '%slow%'; 

+---------------------+--------+

| Variable_name       | Value  |

+---------------------+--------+

| Slow_launch_threads | 0      |

| Slow_queries        | 120    |

+---------------------+--------+

8:系统变量slow_launch_time 是什么? 跟慢查询日志有关系吗?

如果创建线程需要的时间比slow_launch_time多,服务器会增加Slow_launch_threads的状态变量的数量。其实这个状态变量跟慢查询没有什么关系。之所以放到这里,是有人问过这个问题!

参考资料:

https://rj03hou.github.io/mysql/MySQL%E6%85%A2%E6%9F%A5%E8%AF%A2%E6%97%B6%E9%97%B4%E5%88%86%E6%9E%90/

MySQL慢查询日志释疑总结的更多相关文章

  1. mysql慢查询日志分析工具 mysqlsla(转)

    mysql数据库的慢查询日志是非常重要的一项调优辅助日志,但是mysql默认记录的日志格式阅读时不够友好,这是由mysql日志记录规则所决定的,捕获一条就记录一条,虽说记录的信息足够详尽,但如果将浏览 ...

  2. MySQL 慢查询日志分析及可视化结果

    MySQL 慢查询日志分析及可视化结果 MySQL 慢查询日志分析 pt-query-digest分析慢查询日志 pt-query-digest --report slow.log 报告最近半个小时的 ...

  3. ELK logstash 处理MySQL慢查询日志(初步)

    写在前面:在做ELK logstash 处理MySQL慢查询日志的时候出现的问题: 1.测试数据库没有慢日志,所以没有日志信息,导致 IP:9200/_plugin/head/界面异常(忽然出现日志数 ...

  4. MySQL慢查询日志

    实验环境: OS X EI Captian + MySQL 5.7 一.配置MySQL自动记录慢查询日志 查看变量,也就是配置信息 show (global) variables like '%slo ...

  5. 企业级中带你ELK如何实时收集分析Mysql慢查询日志

    什么是Mysql慢查询日志? 当SQL语句执行时间超过设定的阈值时,便于记录到指定的日志文件中或者表中,所有记录称之为慢查询日志 为什么要收集Mysql慢查询日志? 数据库在运行期间,可能会存在这很多 ...

  6. MySQL慢查询日志相关的文件配置和使用。

    MySQL慢查询日志提供了超过指定时间阈值的查询信息,为性能优化提供了主要的参考依据,是一个非常实用的功能,MySQL慢查询日志的开启和配置非常简单,可以指定记录的文件(或者表),超过的时间阈值等就可 ...

  7. MySQL 慢查询日志配置与简析

    MySQL慢查询日志配置与简析 By:授客 QQ:1033553122   <1> 查看是否开启慢查询日志 SHOW VARIABLES LIKE 'slow%'; 说明: a. 如果sl ...

  8. (6) MySQL慢查询日志的使用

    一. 设置方法 使用慢查询日志里捕获 启用之前需要先进行一些设置 方法一:全局变量设置 设置慢查询日志的日志文件位置 set global slow_query_log_file = "D: ...

  9. MySQL慢查询日志总结 日志分析工具mysqldumpslow

    MySQL慢查询日志总结 - 潇湘隐者 - 博客园 https://www.cnblogs.com/kerrycode/p/5593204.html 2016-06-17 10:32 by 潇湘隐者, ...

随机推荐

  1. [Swift]LeetCode813. 最大平均值和的分组 | Largest Sum of Averages

    We partition a row of numbers A into at most K adjacent (non-empty) groups, then our score is the su ...

  2. 安装部署jumpserver3.0

    1.安装依赖包yum -y install git readline-devel automake autoconf2.下载 jumpservergit clone https://github.co ...

  3. 在 ns-3.25中添加 plc(电力线载波) 模块

    上一篇安装好了 ns-3.25,这里继续往里添加 plc 模块.整理之前现推荐一个网站,大家可以参考. 英属哥伦比亚大学(University of British Columbia,UBC)提供NS ...

  4. Mac下安装配置Python2和Python3并相互切换使用

    mac os 以前没有使用过,这次使用了一把,的确还是比较不顺手的,估计从今以后,就要把平台逐渐切换到mac了.今后好的文章,专门会开一个macos专栏,专门记录macos的使用过程中的心得,体会,以 ...

  5. Git中用vim打开、修改、保存文件(转)

    一.vim 有两种工作模式: 1.命令模式:接受.执行 vim操作命令的模式,打开文件后的默认模式: 2.编辑模式:对打开的文件内容进行 增.删.改 操作的模式: 3.在编辑模式下按下ESC键,回退到 ...

  6. java代码之美(8)---guava字符串工具

    guava字符串工具 在java开发过程中对字符串的处理是非常频繁的,google的guava工具对字符串的一些处理进行优化,使我们开发过程中让自己的代码看去更加美观,清爽. 一.Joiner 根据给 ...

  7. C#版 - Leetcode 593. 有效的正方形 - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...

  8. Netty 简介

    上文我们介绍了NIO和BIO的区别,NIO相对于BIO是一次很大的进步.但我们平时开发中并不会使用NIO.这是因为NIO在开发中存在以下问题 NIO的类库和API繁杂,使用麻烦,需要熟练掌握Selec ...

  9. js反爬-从入门到精通webdriver

    学习JS反爬 地址:http://openlaw.cn/login.jsp 想在指导案例中抓些内容,需要登陆 账号密码发送会以下面方式发送 所以需要找到_csrf和加密后的password,_csrf ...

  10. 设计模式总结篇系列:建造者模式(Builder)

    关于建造者模式网上有很多文章,也有些不同的理解.在此结合网上其他文章对建造者模式进行总结. 总体说来,建造者模式适合于一个具有较多的零件(属性)的产品(对象)的创建过程.根据产品创建过程中零件的构造是 ...