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_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节,“Selecting General Query Log and Slow Query Log Output Destinations”)。
如果您指定了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
系统变量控制慢查询日志文件(以及一般查询日志文件和错误日志文件)中的时间戳的时区。但是,它不影响log表中的时间戳,但可以使用CONVERT_TZ()
或将会话time_zone
系统变量设置为所需的时区。
默认情况下,副本不将复制查询写入慢查询日志。要更改此设置,请启用log_slow_replica_statements
系统变量。请注意,如果使用行级别复制(binlog_format=ROW
),这些系统变量将无效。查询仅在被添加到副本的慢查询日志中,当它们在二进制日志中以语句格式记录时,即当binlog_format=STATEMENT
或binlog_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
输出不受影响)。一些字段描述引用状态变量名称。请查看状态变量描述以获取更多信息。然而,在慢查询日志中,计数器是每个语句的值,而不是会话的累积值。
-
Thread_id:
ID
语句线程标识符。
-
Errno:
错误号
语句错误号,或者如果没有错误发生则为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
-
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
时,慢查询日志文件可能包含两种类型的行:带有额外字段的行和不带额外字段的行。日志文件分析器可以根据字段数量来确定行是否包含额外字段。
每个语句在慢查询日志文件中都被preceded by a SET
语句,该语句包括时间戳,表示慢查询语句的执行开始时间。
服务器将在慢查询日志文件中重写密码,以避免在明文中出现。请参阅第8.1.2.3节,“密码和日志记录”。
无法解析的语句(例如,语法错误)将不被写入慢查询日志。