慢查询日志包含执行时间超过 long_query_time
秒且至少需要检查 min_examined_row_limit
行的 SQL 语句。慢查询日志可用于查找执行时间较长的查询,这些查询是需要优化的候选项。但是,检查一个很长的慢查询日志可能是一项耗时的任务。为了简化此操作,您可以使用 mysqldumpslow 命令处理慢查询日志文件并汇总其内容。请参阅 第 6.6.10 节,“mysqldumpslow — 汇总慢查询日志文件”。
获取初始锁定的时间不计入执行时间。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=
。要指定日志目标,请使用 文件名
log_output
系统变量(如 第 7.4.1 节,“选择常规查询日志和慢查询日志输出目标” 中所述)。
如果您指定 TABLE
日志目标,请参阅 日志表和 “打开的文件过多” 错误。
如果没有为慢查询日志文件指定名称,则默认名称为
。除非给出绝对路径名来指定不同的目录,否则服务器将在数据目录中创建该文件。主机名
-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
并且以语句格式记录了该语句时,才会将查询添加到副本的慢查询日志中。即使启用了 log_slow_replica_statements
,在设置了 binlog_format=MIXED
时以行格式记录的慢查询或在设置了 binlog_format=ROW
时记录的慢查询也不会添加到副本的慢查询日志中。
启用慢查询日志后,服务器会将输出写入 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 节“密码和日志记录”。
无法解析的语句(例如,由于语法错误)不会写入慢查询日志。