慢查询日志包含了执行时间超过 long_query_time 秒的 SQL 语句,并且需要至少 min_examined_row_limit 行被检查。慢查询日志可以用来查找执行时间长的查询,从而是优化的候选者。然而,检查一个长慢查询日志可能是一个耗时的任务。为了使其更容易,你可以使用 mysqldumpslow 命令来处理慢查询日志文件并总结其内容。见 第 6.6.10 节,“mysqldumpslow — Summarize Slow Query Log Files”。
获取初始锁定的时间不计入执行时间。mysqld 在语句执行完毕并释放所有锁定后将语句写入慢查询日志,因此日志顺序可能与执行顺序不同。
最小和默认值 long_query_time 分别为 0 和 10。该值可以以微秒为单位指定。
默认情况下,管理语句不会被记录,也不会记录不使用索引的查询。可以使用 log_slow_admin_statements 和 log_queries_not_using_indexes 更改此行为,如后面所述。
默认情况下,慢查询日志是禁用的。要明确指定慢查询日志的初始状态,请使用 --slow_query_log[={0|1}]。无参数或参数为 1 时,--slow_query_log 启用日志。参数为 0 时,该选项禁用日志。要指定日志文件名,请使用 --slow_query_log_file=。要指定日志目标,请使用 file_namelog_output 系统变量(如 第 7.4.1 节,“选择通用查询日志和慢查询日志输出目标” 所述)。
如果您指定了 TABLE 日志目标,请参阅 日志表和“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_slow_admin_statements 系统变量。管理语句包括 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_query_time秒,或者log_queries_not_using_indexes必须启用,并且查询未使用索引进行行查找。 -
查询必须至少检查
min_examined_row_limit行。 -
查询不能根据
log_throttle_queries_not_using_indexes设置被抑制。
log_timestamps 系统变量控制慢查询日志文件(以及一般查询日志文件和错误日志)中的时间戳的时区。它不影响一般查询日志和慢查询日志表中的时间戳,但可以使用 CONVERT_TZ() 或设置会话 time_zone 系统变量将行从本地系统时区转换为任何所需的时区。
默认情况下,副本不会将复制的查询写入慢查询日志。要更改此设置,请启用 log_slow_replica_statements 系统变量。请注意,如果使用基于行的复制(binlog_format=ROW),这些系统变量将无效。只有当查询以语句格式记录在二进制日志中时,才将其添加到副本的慢查询日志中,即当 binlog_format=STATEMENT 设置时,或者当 binlog_format=MIXED 设置时,并且语句以语句格式记录时。慢查询日志中记录的慢查询,如果以行格式记录时 binlog_format=MIXED 设置,或者记录时 binlog_format=ROW 设置,即使 log_slow_replica_statements 启用,也不会添加到副本的慢查询日志中。
当慢查询日志启用时,服务器将输出写入指定的目标,例如由 log_output 系统变量指定的目标。如果启用日志,服务器将打开日志文件并写入启动消息。但是,除非选择了 FILE 日志目标,否则不会记录查询到文件中。如果目标是 NONE,即使慢查询日志启用,服务器也不会写入查询。设置日志文件名对日志记录没有影响,除非选择了 FILE 作为输出目标。
如果慢查询日志启用并选择了 FILE 作为输出目标,每个写入日志的语句都将以 # 字符开头,并包含以下字段(所有字段在同一行):
-
Query_time:duration语句执行时间,以秒为单位。
-
Lock_time:duration获取锁定的时间,以秒为单位。
-
Rows_sent:N发送到客户端的行数。
-
Rows_examined:服务器层面检查的行数(不包括存储引擎内部的处理)。
启用 log_slow_extra 系统变量将导致服务器在 FILE 输出中写入以下额外字段,除了上述字段外(TABLE 输出不受影响)。一些字段描述引用状态变量名称。请参阅状态变量描述以获取更多信息。但是,在慢查询日志中,计数器是每个语句的值,而不是累积的会话值。
-
Thread_id:ID语句线程标识符。
-
Errno:error_number语句错误号,或者 0 表示没有错误。
-
Killed:N如果语句被终止,表示终止原因的错误号,或者 0 表示语句正常终止。
-
Bytes_received:N语句的
Bytes_received值。 -
Bytes_sent:N语句的
Bytes_sent值。 -
Read_first:N语句的
Handler_read_first值。 -
Read_last:N语句的
Handler_read_last值。 -
Read_key:N该
Handler_read_key语句的值。 -
Read_next:N该
Handler_read_next语句的值。 -
Read_prev:N该
Handler_read_prev语句的值。 -
Read_rnd:N该
Handler_read_rnd语句的值。 -
Read_rnd_next:N该
Handler_read_rnd_next语句的值。 -
Sort_merge_passes:N该
Sort_merge_passes语句的值。 -
Sort_range_count:N该
Sort_range语句的值。 -
Sort_rows:N该
Sort_rows语句的值。 -
Sort_scan_count:N该
Sort_scan语句的值。 -
Created_tmp_disk_tables:N该
Created_tmp_disk_tables语句的值。 -
Created_tmp_tables:N该
Created_tmp_tables语句的值。 -
Start:timestamp语句执行的开始时间。
-
End:timestamp语句执行的结束时间。
给定的慢查询日志文件可能包含启用log_slow_extra后添加的额外字段的行和不包含这些字段的行。日志文件分析器可以通过字段计数来确定一行是否包含额外字段。
每个写入慢查询日志文件的语句都以一个SET语句开头,该语句包括一个时间戳,指示慢语句何时开始执行。
写入慢查询日志文件的语句中的密码被服务器重写,不会以明文形式出现。请参阅第 8.1.2.3 节,“密码和日志记录”。
无法解析的语句(例如,语法错误)不会写入慢查询日志。