慢查询日志包含了执行时间超过 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_name
log_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 节,“密码和日志记录”。
无法解析的语句(例如,语法错误)不会写入慢查询日志。