慢查询日志包含执行时间超过 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=
。要指定日志目的地,请使用 file_name
log_output
系统变量(如 第 7.4.1 节,“选择通用查询日志和慢查询日志输出目的地” 中所述)。
如果您指定了 TABLE
日志目的地,请参见 日志表和 “打开的文件太多” 错误。
如果您未指定慢查询日志文件的名称,则默认名称为
。服务器会在数据目录中创建该文件,除非指定绝对路径名以指定其他目录。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 节,“密码和日志记录”。
无法解析的语句(例如由于语法错误)不会写入慢查询日志。