慢查询日志由SQL语句组成,这些语句需要花费超过 long_query_time几秒钟的时间来执行,并且至少 min_examined_row_limit需要检查行。慢查询日志可用于查找执行时间较长的查询,因此可以作为优化的候选对象。但是,检查较长的慢查询日志可能是一项耗时的任务。为了使此操作更容易,您可以使用 mysqldumpslow命令来处理慢速查询日志文件并总结其内容。请参见 第4.6.9节“ **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时,此选项禁用日志。要指定日志文件名,请使用 。要指定日志目标,请使用 系统变量(如第5.4.1节“选择常规查询日志和慢查询日志输出目标”中所述)。 --slow_query_log_file=*file_name*log_output
注意
如果指定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_slave_statements 系统变量。请注意,如果正在使用基于行的复制(binlog_format=ROW), log_slow_slave_statements则无效。仅在二进制日志中以语句格式记录查询时(即,何时binlog_format=STATEMENT设置或何时binlog_format=MIXED设置并且以语句格式记录语句),查询才会添加到副本的慢速查询日志中 。binlog_format=MIXED设置时以行格式记录的慢速查询或设置时 记录 binlog_format=ROW的慢速查询不会添加到副本的慢速查询日志中,即使 log_slow_slave_statements已启用也是如此。
慢查询日志内容
启用慢速查询日志后,服务器会将输出写入log_output系统变量指定的任何目标 。如果启用日志,服务器将打开日志文件并向其中写入启动消息。但是,除非FILE选择了日志目标,否则不会进一步查询查询文件。如果目标是 NONE,则即使启用了慢速查询日志,服务器也不会写入任何查询。如果FILE未选择日志文件名作为输出目标,则设置日志文件名对日志记录无效。
如果启用了慢查询日志并将FILE其选择为输出目标,则写入日志的每个语句都以一行开头,该行以#字符开头 并具有以下字段(所有字段都位于一行):
-
Query_time: *duration*语句执行时间,以秒为单位。
-
Lock_time: *duration*获取锁的时间(以秒为单位)。
-
Rows_sent: *N*发送给客户端的行数。
-
Rows_examined:*``*服务器层检查的行数(不计算存储引擎内部的任何处理)。
启用log_slow_extra 系统变量(自MySQL 8.0.14起可用)使服务器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 包含时间戳的语句。从MySQL 8.0.14开始,时间戳指示慢速语句何时开始执行。在8.0.14之前,时间戳指示慢速语句的记录时间(在语句完成执行后发生)。
服务器将重写写入慢速查询日志的语句中的密码,以使之不会以纯文本形式出现。请参见第6.1.2.3节“密码和日志记录”。




