Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


7.4.5 慢查询日志

慢查询日志由执行时间超过long_query_time秒的SQL语句组成,并且需要至少min_examined_row_limit行被检查。慢查询日志可以用来找到执行时间较长的查询语句,从而确定优化的候选项。然而,检查慢查询日志可能是一个时间-consuming的任务。为了使这个过程更容易,可以使用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节,“Selecting General Query Log and Slow Query Log Output Destinations”)。

Note

如果您指定了TABLE日志目标,见日志表和太多打开文件错误.

如果您没有为慢查询日志文件指定名称,缺省名称为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系统变量控制慢查询日志文件(以及一般查询日志文件和错误日志文件)中的时间戳的时区。但是,它不影响log表中的时间戳,但可以使用CONVERT_TZ()或将会话time_zone系统变量设置为所需的时区。

默认情况下,副本不将复制查询写入慢查询日志。要更改此设置,请启用log_slow_replica_statements系统变量。请注意,如果使用行级别复制(binlog_format=ROW),这些系统变量将无效。查询仅在被添加到副本的慢查询日志中,当它们在二进制日志中以语句格式记录时,即当binlog_format=STATEMENTbinlog_format=MIXED时记录时。slow queries在binlog_format=MIXED时或binlog_format=ROW时记录在行格式下,即使启用log_slow_replica_statements,也不会被添加到副本的慢查询日志中。

当慢查询日志启用时,服务器将输出到log_output系统变量指定的任何目标。如果启用日志,服务器将打开日志文件并将启动消息写入其中。然而,如果日志启用,服务器将不会继续记录查询到文件中,除非选择了FILE日志目标。如果目标是NONE,服务器将不会记录任何查询,即使慢查询日志启用。设置日志文件名对记录无效,如果FILE不是选择的输出目标。

如果慢查询日志启用且FILE是选择的输出目标,每个语句写入日志的开头都将以log_output系统变量指定的目标写入。

  • Query_time: duration

    语句执行时间(秒)。

  • Lock_time: duration

    获取锁定的时间(秒)。

  • Rows_sent: N

    发送到客户端的行数。

  • Rows_examined:

    服务器层次的行数(不包括存储引擎内部的处理)。

启用log_slow_extra系统变量将使服务器在FILE输出中写入以下额外字段,除了上述字段外(TABLE输出不受影响)。一些字段描述引用状态变量名称。请查看状态变量描述以获取更多信息。然而,在慢查询日志中,计数器是每个语句的值,而不是会话的累积值。

在启用log_slow_extra时,慢查询日志文件可能包含两种类型的行:带有额外字段的行和不带额外字段的行。日志文件分析器可以根据字段数量来确定行是否包含额外字段。

每个语句在慢查询日志文件中都被preceded by a SET 语句,该语句包括时间戳,表示慢查询语句的执行开始时间。

服务器将在慢查询日志文件中重写密码,以避免在明文中出现。请参阅第8.1.2.3节,“密码和日志记录”

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