之前写了一篇“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]LeetCode472. 连接词 | Concatenated Words

    Given a list of words (without duplicates), please write a program that returns all concatenated wor ...

  2. apache(OS 10013)以一种访问权限不允许的方式做了一个访问套接字的尝试 ...

    今天启动Apache时, 报了“(OS 10013)以一种访问权限不允许的方式做了一个访问套接字的尝试. : make_sock: could not bind to address 0.0.0.0: ...

  3. VMware修改为静态ip

    选择编辑-虚拟机网路编辑器-NAT模式记录 本机cmd执行命令:ipconfig /all  查看VMnet8的ip地址,跟虚拟机子网ip一个网段 确定. su - root 切换到root用户下 修 ...

  4. Spring高级装配bean

    目录 spring profile 条件化的bean声明 自动装配与歧义性 bean的作用域 Spring表达式语言 一.环境与profile 配置profile  bean 在软件开发的时候,有一个 ...

  5. CentOS Too Many Open Files 解决

    问题 在使用 WRK 对应用服务进行压测的时候,提示 "too many open files" 信息,导致无法启动测试. 原因 CentOS 7.x 默认的打开文件数目限制为 1 ...

  6. Python合并多个Excel数据

    安装模块 1.找到对应的模块  http://www.python-excel.org/ 2.用pip install 安装 pip install xlrdpip install XlsxWrite ...

  7. Kali 无法正常上网问题

    有时候我们会突然发现我们的kali不能够正常上网,在终端使用ping 命令对其进行检查,显示网络不可达, 然后使用ifconfig,可以看到没有正在工作的网卡,只有localhost 接着使用ifco ...

  8. protobuf、LRU、sigleflight

    今天咱一次讲3个吧,赶一下进度,好早点开始聊kubernetes! 从groupcache的项目目录结构看,我们今天要学习groupcachepb.lru.singleflight这3个package ...

  9. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->Web版本模块管理界面新增模块排序功能

    模块(菜单)的排序是每个系统都必须要有的功能,我们框架模块的排序在业务逻辑中已经体现. WinForm版本可以直接在界面上对模块进行排序以控制模块展示的顺序.Web版本在3.2版本中也新增了直接可以模 ...

  10. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2-> “Tab”标签新增可“最大化”显示功能

    最大化工作区的功能是非常必要的,特别是当模块功能比较多时,把工作区最大的展现出来就变得很重要,RDIFramework.NET V3.2版本对工作区新增了最大功能,最大化工作区后如下图所示:  具体使 ...