Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

7.4.5 慢查询日志

慢查询日志包含了执行时间超过 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_statementslog_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 节,“选择通用查询日志和慢查询日志输出目标” 所述)。

Note

如果您指定了 TABLE 日志目标,请参阅 日志表和“Too many open files” 错误

如果您没有指定慢查询日志文件的名称,默认名称为 host_name-slow.log。服务器在数据目录中创建文件,除非指定了绝对路径名以指定不同的目录。

要在运行时禁用或启用慢查询日志或更改日志文件名,请使用全局 slow_query_logslow_query_log_file 系统变量。将 slow_query_log 设置为 0 以禁用日志,或者设置为 1 以启用日志。将 slow_query_log_file 设置为指定日志文件名。如果已经打开了日志文件,它将被关闭,新的文件将被打开。

如果您使用 --log-short-format 选项,服务器将写入慢查询日志的信息较少。

要在慢查询日志中包括慢速管理语句,启用 log_slow_admin_statements 系统变量。管理语句包括 ALTER TABLEANALYZE TABLECHECK TABLECREATE INDEXDROP INDEXOPTIMIZE TABLEREPAIR TABLE

要在慢查询日志中包括未使用索引的查询语句,启用 log_queries_not_using_indexes 系统变量。(即使启用了该变量,服务器也不会记录少于两行的表中的查询,因为这些查询不会从索引中受益。)

当未使用索引的查询被记录时,慢查询日志可能会快速增长。可以通过设置 log_throttle_queries_not_using_indexes 系统变量来限制这些查询的速率。默认情况下,该变量为 0,表示没有限制。正值将对每分钟内未使用索引的查询进行限制。第一个这样的查询将打开 60 秒的窗口,在该窗口内,服务器将记录查询,直到达到限制,然后抑制其他查询。如果在窗口结束时还有被抑制的查询,服务器将记录一个摘要,表明有多少查询和总共花费的时间。下一个 60 秒窗口将在服务器记录下一个未使用索引的查询时开始。

服务器使用以下控制参数来确定是否将查询写入慢查询日志:

  1. 查询必须不是管理语句,或者 log_slow_admin_statements 必须启用。

  2. 查询必须至少花费 long_query_time 秒,或者 log_queries_not_using_indexes 必须启用,并且查询未使用索引进行行查找。

  3. 查询必须至少检查 min_examined_row_limit 行。

  4. 查询不能根据 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 输出不受影响)。一些字段描述引用状态变量名称。请参阅状态变量描述以获取更多信息。但是,在慢查询日志中,计数器是每个语句的值,而不是累积的会话值。

给定的慢查询日志文件可能包含启用log_slow_extra后添加的额外字段的行和不包含这些字段的行。日志文件分析器可以通过字段计数来确定一行是否包含额外字段。

每个写入慢查询日志文件的语句都以一个SET语句开头,该语句包括一个时间戳,指示慢语句何时开始执行。

写入慢查询日志文件的语句中的密码被服务器重写,不会以明文形式出现。请参阅第 8.1.2.3 节,“密码和日志记录”

无法解析的语句(例如,语法错误)不会写入慢查询日志。