学会读懂 MySql 的慢查询日志

在前边的博客《何时、怎样开启 MySql 日志?》中,我们了解到了怎样启用 MySql 的慢查询日志。

今天我们来看一下怎样去读懂这些慢查询日志。
在跟踪慢查询日志之前。首先你得保证最少发生过一次慢查询。假设你没有能够自己制造一个:
[email protected]# mysql -e ‘SELECT SLEEP(8);
上述操作所做的事情仅仅有一个:"睡"(啥也不做)八秒。这个长度应该足以被记录在你的慢查询日志里了(我通常推荐针对长于 2 或 3 秒的查询进行慢查询记录)。
首先,我们看看一个慢速查询日志条目是什么样子的:
[email protected]# tail /var/log/slowqueries
# Time: 130320  7:30:26
# [email protected]: db_user[db_database] @ localhost []
# Query_time: 4.545309  Lock_time: 0.000069 Rows_sent: 219  Rows_examined: 254
SET timestamp=1363779026;
SELECT option_name, option_value FROM wp_options WHERE autoload = ‘yes‘;
我们来过一下每一行所代表的意思:

  • 第一行表示记录日志时的时间。其格式是 YYMMDD H:M:S。我们能够看出上面的查询记录于 2013 年 3 月 20 日上午 7:30 - 注意:这个是server时间,可能跟你本地时间有所不同
  • 然后,我们能够看到 MySql 用户、server以及主机名
  • 第三行表示总的查询时间、锁定时间、"发送"或者返回的行数、查询过程中所检查的行数
  • 接下来我们看到的是 SET timestamp=UNIXTIME; 这是查询实际发生的时间。假设你想找如今的一些慢查询。通过检查这个就不会发生你所检查的是几个月之前所发生的慢查询了。下边我会介绍怎样将其变成一个实用的时间
  • 最后一行显示完整的查询语句

要将 Unix 时间转成一个人类可读的时间,能够使用 date -d 命令。

输入 date -d @(记得要包含 @ 符号),然后在 @(之间没有空格)后粘贴日志中的时间戳:
[email protected]# date -d @1363779026
Wed Mar 20 07:30:26 EDT 2013
上面样例中我们能够看到查询进行的同一时候记录了该日志 - 可是对于一台超负载的server经常并不是如此。

因此记住:SET timestamp= value 才是实际的查询的执行时间。

如今我来演示一下我是怎样使用 MySql 慢查询日志来解决我的某个站点上的一个真实问题的。

你的查询可能与此不太一样,可是解决这个问题的原理是相通的。

我在一个博客站点上使用了一个名为 Tweet Blender 的插件来自己主动显示相关微博到我的keyword中。不幸的是,一些人发现了这个并使用我的微博中的keyword来发一些垃圾微博 - 无论怎样,终于结果就是我的博客站点上显示的是一些垃圾微博。

由于相关微博在我的站点存在的时间并不长,所以我在站点上并没有发现什么问题。直到我查看慢查询日志。
我的站点对带有垃圾信息(垃圾信息经常都是一样的)的微博进行了几个相似的查询,经过一段时间后这些查询的数量太大以致当中的一些执行迟缓。

当这样的情况发生的时候,由于请求的数量非常大,有些朋友的站点非常可能会因此假死或者直接报错。可是我的server经过非常好的性能调优,因此并没有非常明显的影响。幸运的是当时我正在进行慢查询日志查看。及时发现了这一情况并迅速攻克了这个问题。
这个问题的解决非常easy - Tweet Blender 具备一个美丽的过滤功能。我仅仅需将该微博username以及一些垃圾keyword加入到 "exclude" 列表。之后就再也没有这样的问题了。这样看来,对我们自己站点以及日志的监控是多么重要,即使是一星期对每一个站点/server仅仅进行一次高速检查。

原文链接:http://calladeveloper.blogspot.com/2013/03/howto-read-mysql-slow-query-log.html

时间: 2024-10-05 11:36:22

学会读懂 MySql 的慢查询日志的相关文章

mysql 通过慢查询日志查写得慢的sql语句

MySQL通过慢查询日志定位那些执行效率较低的SQL 语句,用--log-slow-queries[=file_name]选项启动时,mysqld 会写一个包含所有执行时间超过long_query_time 秒的SQL语句的日志文件,通过查看这个日志文件定位效率较低的SQL . 慢查询日志在查询结束以后才记录,所以在应用反映执行效率出现问题的时候查询慢查询日志并不能定位问题,可以使用show processlist命令查看当前MySQL在进行的线程,包括线程的状态.是否锁表等,可以实时地查看SQ

PHP慢脚本日志和Mysql的慢查询日志(转)

1.PHP慢脚本日志 间歇性的502,是后端 PHP-FPM 不可用造成的,间歇性的502一般认为是由于 PHP-FPM 进程重启造成的. 在 PHP-FPM 的子进程数目超过的配置中的数量时候,会出现间歇性的502错误,如果在配置中设置了max_requests的话,超过数量也会出现502错误,而max_requests的设置,正是为了防止不安全的第三方library脚本的 内存泄露 ,当然你自己编写的脚本存在 死锁 的话,也会出现502现象. 如果你发现mysql负载并不高,但是php-fp

使用MySQL的慢查询日志找到低效的SQL语句

如题,要开启mysql的慢查询日志可以在mysql的配置文件中的[mysqld]下设置两项: log-slow-queries = D:/soft/PHPnow/MySQL-5.1.50/test.log         long_query_time = 1 log-slow-queries表示日志册存储位置,long_query_time表示执行时间 单位是秒,这样设置后重启MySQL服务器,查询超过1秒的sql语句将会记录到日志中,需要注意的是log_query_time不能设置小数(经测

MySQL 的慢查询日志

MySQL 的慢查询日志 MySQL 的慢查询日志是 MySQL 提供的一种日志记录,它用来记录在 MySQL 中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的 SQL, 则会被记录到慢查询日志中.long_query_time的默认值为10,意思是运行10s以上的语句. 默认情况下,MySQL数据库并不启动慢查询日志,需要我们手动来设置这个参数, 当然,如果不是调优需要的话,一般不建议启动该参数, 因为开启慢查询日志或多或少会带来一定的性能影响. 慢查询日志支持将

读懂mysql慢查询日志

我们来看一下如何去读懂这些慢查询日志.在跟踪慢查询日志之前,首先你得保证最少发生过一次慢查询.如果你没有可以自己制造一个:[email protected]# mysql -e 'SELECT SLEEP(8);上述操作所做的事情只有一个:"睡"(啥也不做)八秒.这个长度应该足以被记录在你的慢查询日志里了(我通常推荐针对长于 2 或 3 秒的查询进行慢查询记录).首先,我们看看一个慢速查询日志条目是什么样子的:[email protected]# tail /var/log/slowq

如何读懂SQL Server的事务日志

简介 本文将介绍SQL Server的事务日志中记录了哪一些信息,如何来读懂这些事务日志中信息.首先介绍一个微软没有公开的函数fn_dblog,在文章的接下来的部分主要用到这个函数来读取事务日志. fn_dblog(@StartingLSN,@EndingLSN) [email protected]:表示起始的LSN号,如果为NULL值则表示从首日志记录开始查询. [email protected]:表示结束的LSN号,如果为NULL值则表示查询到尾日志记录. --需要注意的是我们平时所看到的L

MYSQL开启慢查询日志实施

查看当前服务器是否开启慢查询: 1.快速办法,运行sql语句show VARIABLES like "%slow%" 2.直接去my.conf中查看. my.conf中的配置(放在[mysqld]下的下方加入) [mysqld] log-slow-queries = /usr/local/mysql/var/slowquery.loglong_query_time = 1  #单位是秒log-queries-not-using-indexes 使用sql语句来修改:不能按照my.con

MySQL的慢查询日志

mysql本身支持慢查询日志,可以配置SQL查询超过特定时间的查询记录到日志中.这在优化SQL查询中是非常有效的工具,能够帮助我们快速定位发生问题的SQL. 慢查询日志常用的变量   long_query_time : 最小值为0,默认为10毫秒,仅记录超过查询时间的SQL,最小粒度为毫秒. min_examined_row_limit : 执行查询时扫描过的行数. slow_query_log_file : 慢查询日志文件名称 log-output : 慢查询日志存放路径 log_querie

mysql开启慢查询日志

所谓慢查询即一条sql语句的查询时间超过了预定义好的规定查询时间,这些语句是要记录下来做语句优化使用的,下面是如何记录慢查询语句的方法: 1.先查看是否开启慢查询日志功能: mysql> show global variables  like 'slow_query_log'; +----------------+-------+ | Variable_name  | Value | +----------------+-------+ | slow_query_log | OFF   | +-