MySQL Slow Query log(慢查询日志)

慢查询日志由执行时间超过long_query_time秒且至少有min_examined_row_limit行被检查的SQL语句组成。long_query_time的最小值与默认值为0和10。它也可以指定为微秒。对于写入文件的日志,时间信息会被记录并且包含微秒部分。对于写入日志表的记录,只有整数时间被记录,微秒部分被忽略。

默认情况下,管理语句不会被记录,也不会记录不使用索引进行查询的语句。可以使用log_slow_admin_statements和log_queries_not_using_indexes来改变这种行为。

获取初始锁的时间不计算为执行时间。mysqld会在语句执行完成和所有锁被释放完成后将语句写入慢查询日志,因此日志顺序可能与语句的执行顺序不一致。

默认情况下,慢查询日志是被禁用的。为了显式指定初始化慢查询日志状态,使用–slow_query_log={0|1}。不使用参数值或参数值为1时,–slow_query_log启用日志。使用参数值为0时,禁用日志。为了指定慢查询日志文件名,使用–slow_query_log_file=file_name。为了指定日志目录,使用–log-output。

mysql> show variables like 'slow_query%';
+---------------------+-------------------------------------+
| Variable_name       | Value                               |
+---------------------+-------------------------------------+
| slow_query_log      | OFF                                 |
| slow_query_log_file | /mysqldata/mysql/localhost-slow.log |
+---------------------+-------------------------------------+
2 rows in set (0.01 sec)


mysql> show variables like 'log_output';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output    | FILE  |
+---------------+-------+
1 row in set (0.01 sec)

如果没有为慢查询日志文件指定文件名,默认文件名为host_name-slow.log。除非使用绝对路私名指定不同的目录否则将在数据目录下创建默认文件。

为了禁用或启用慢查询日志或在运行时改变日志文件名,使用全局的slow_query_log和slow_query_log_file系统变量。设置slow_query_log为0(或OFF)来禁用日志,设置为1(或ON)来启用日志。设置slow_query_log_file来指定日志文件名。如果一个日志文件已经打开 ,它将关闭再打开新文件。

当慢查询日志被启用时,服务器将输出写入到由–log-output选项或log_output系统变量所指定的任何目录中。如果启用了日志,服务器打开日志文件并将启动信息写入文件中。然而,除非FILE日志目录被选择否则查询的进一步日志不会记录在文件中。如果目录为NONE,即使慢查询日志被启用也不会记录查询。如果日志目录不包含FILE,设置日志文件名不会影响日志功能。

如果使用–log-short-format选项,服务器会写少量信息到慢查询日志中。

为了在写入到慢查询日志中的语句中包含慢速管理语句,使用log_slow_admin_statements系统变量。管理语句包括alter table,
analyze table,check table,create index, drop index,optimizer table和repair table。

为了将不使用索引的语句写入慢查询日志中,可以启用log_queries_not_using_indexes系统变量。当这样的查询被写入时,慢查询日志可能增长很快。通过设置log_throttle_queries_not_using_indexes系统变量来对这些查询设置速率限制是有可能的。默认情况下,这个变量为0,这意味着没有限制。正值对不使用索引的查询的日志记录施加了每分钟的限制。第一个这样的查询打开一个60秒的窗口,在这个窗口内,服务器将查询记录到给定的限制,然后抑制其他查询。如果在窗口结束时存在被抑制的查询,服务器将记录一个摘要,指出有多少查询以及在这些查询中花费的累计时间。当服务器记录下一个不使用索引的查询时,下一个60秒窗口开始。

服务器按照以下顺序使用控制参数来决定是否向慢速查询日志写入查询:
1.查询必须不是管理语句或者log_slow_admin_statements必须被启用。
2.查询必须至少花了long_query_time所设定的秒数或者启用log_queries_not_using_indexes和没有使用索引的查询
3.查询必须至少检查了min_examined_row_limit所设置的行数。
4.根据log_throttle_queries_not_using_indexes设置必须不能被禁止。

log_timestamps系统变量控制着写入慢查询日志(通用查询日志和错误日志也一样)中信息所包含的时间戳中的时区信息。它不会影响写入通用查询日志和写入日志表中慢查询日志信息中的时区信息,但从这些日志表中检索数据通过使用convert_tz()或通过设置time_zone系统变量可以从本地系统时区转换成你所期待的任何时区。

所有日志行都包含一个时间戳。

服务器不会将由查询缓存处理的查询写入慢速查询日志,也不会将由于表只有零行或一行而无法从索引中获益的查询写入慢速查询日志。

默认情况下,复制从服务器不会将复制的查询写入慢速查询日志。为了改变这种行为,可以使用log_slow_slave_statements系统变量。

写入慢速查询日志的语句中的密码由服务器重写,不会以明文形式出现。

慢速查询日志可用于查找执行时间较长的查询,因此可以进行优化。然而,检查一个长的慢查询日志可能成为一项困难的任务。为了简化这一过程,可以使用mysqldumpslow命令处理一个慢速查询日志文件,以总结日志中出现的查询

发表评论

电子邮件地址不会被公开。