目录
慢查询日志由SQL语句组成,执行慢查询需要花费的时间超过 long_query_time的值
,并且至少 min_examined_row_limit的value行
需要检查。慢查询日志可用于查找执行时间较长的查询,因此可作为优化的候选对象。但是,检查较长的慢查询日志可能是一项耗时的任务。为了使此操作更容易,您可以使用 mysqldumpslow命令来处理慢速查询日志文件并总结其内容。请参见 第4.6.8节“ mysqldumpslow-汇总慢查询日志文件”。
获取初始锁的时间不算作执行时间。 mysqld在执行完后以及释放所有锁之后将语句写入慢查询日志,因此日志顺序可能与执行顺序不同。
慢查询日志参数
long_query_time
最小值和默认值分别为0和10。可以将值指定为微秒级。
默认情况下,不记录管理语句,也不记录不使用索引的查询。可以使用log_slow_adminstatements和log_queries_not_using_indexes更改此行为,如稍后所述。
默认情况下,慢速查询日志是禁用的。要明确指定初始慢查询日志状态,请使用 --slow_query_log[={0|1}]
。如果没有参数或参数为 1,--slow_querylog将启用 log。参数为0时,禁用日志。要指定 log 文件名,请使用--slow_query_log_file=filename。要指定 log 目标,请使用log_output系统变量(如第5.4.1节“选择常规查询日志和慢查询日志输出目标”中所述)。
注意
如果指定TABLE
log 目标,请参阅Log Tables 和“Too many open files”错误。
如果您没有为慢速查询日志文件指定名称,则默认名称为
。除非指定了绝对路径名以指定其他目录,否则服务器将在数据目录中创建文件。host_name
-slow.log
要在运行时禁用或启用慢查询日志或更改日志文件名,请使用全局 变量slow_query_log
和 slow_query_log_file
系统变量。设置slow_query_log
为0禁用日志,设置为1启用日志。设置 slow_query_log_file
以指定日志文件的名称。如果日志文件已经打开,则将其关闭并打开新文件。
如果使用该--log-short-format
选项,服务器将较少的信息写入慢速查询日志。
要在慢速查询 log 中包含缓慢的管理语句,请启用log_slow_adminstatements系统变量。管理语句包括 ALTER TABLE
, ANALYZE TABLE
, CHECK TABLE
, CREATE INDEX
, DROP INDEX
, OPTIMIZE TABLE
,和 REPAIR TABLE
。
要在写入慢速查询日志的语句中包括不使用索引进行行查找的查询,请启用 log_queries_not_using_indexes
系统变量。(即使启用了该变量,服务器也不会记录由于表少于两行而无法从索引的存在中受益的查询。)
记录不使用索引的查询时,慢查询日志可能会迅速增长。通过设置log_throttle_queries_not_using_indexes
系统变量,可以对这些查询设置速率限制 。默认情况下,此变量为0,表示没有限制。正值对不使用索引的查询的日志记录施加每分钟的限制。第一个这样的查询将打开一个60秒的窗口,服务器在该窗口中记录查询直至达到给定的限制,然后取消其他查询。如果在窗口结束时存在被抑制的查询,则服务器会记录一个摘要,该摘要指示有多少查询以及在这些查询中花费的总时间。当服务器记录下一个不使用索引的查询时,下一个60秒窗口开始。
服务器按以下顺序使用控制参数来确定是否将查询写入慢查询日志:
-
该查询必须不是管理语句,或者
log_slow_admin_statements
必须启用。 -
查询必须至少执行long_querytime秒,或者
log_queries_not_using_indexes
必须启用并且该查询未使用任何索引进行行查找。 -
该查询必须至少检查了
min_examined_row_limit
行。 -
不得根据
log_throttle_queries_not_using_indexes
设置禁止查询 。
log_timestamps
系统变量控制在写入慢查询日志文件消息的时间戳的时区(以及到一般查询日志文件和错误日志)。
它不影响写入日志表的常规查询日志和慢速查询日志消息的时区,但从这些表中检索的行可以使用CONVERT_TZ()从本地系统 time zone 转换为任何所需的 time zone,或者通过设置 session timezone系统变量。
服务器不记录查询缓存处理的查询。
默认情况下,从属复制服务器不会将复制查询写入慢速查询 log。要更改此设置,请启用 log_slow_slave_statements
系统变量。请注意,如果正在使用基于行的复制(binlog_format=ROW
), log_slow_slave_statements
则无效。仅在二进制日志中以语句格式记录查询时(即,当设置了binlog_format=STATEMENT时,或者设置了binlog_format=MIXED并且语句以语句格式记录时,查询才会添加到从属的慢速查询日志中 。设置binlog_format=MIXED时以行格式记录的慢查询,或设置binlog_format=ROW时记录的慢查询,不会添加到从属的慢查询 log 中,即使启用了log_slow_slavestatements也是如此。
慢查询日志内容
启用慢速查询日志后,服务器会将输出写入由log_output
系统变量指定的任何目标 。如果启用日志,服务器将打开日志文件并向其中写入启动消息。但是,除非选择FILE
log 目标,否则不会对文件进行进一步的查询日志记录。如果目标是NONE
,则即使启用了慢查询 log,服务器也不会写入任何查询。如果未选择FILE
作为输出目标,则设置日志文件名对日志记录无效。
如果启用了慢查询 log 并且选择FILE
作为输出目标,则写入 log 的每个语句前面都有一个以#
字符开头并具有这些字段的行(所有字段都在一行上):
- Query_time: duration
语句执行时间,以秒为单位。
- Lock_time: duration
获取锁的时间(以秒为单位)。
- Rows_sent: N
发送到 client 的行数。
- Rows_examined:
服务器层检查的行数(不计算存储引擎内部的任何处理)。
写入慢速查询日志文件的每个语句之前都有一个SET
包含时间戳的语句,指示何时记录慢语句(在语句完成执行后发生)。
写入慢查询 log 的语句中的密码由服务器重写,不会以纯文本形式发生。见第 6.1.2.3 节,“密码和 Logging”。