JeeStudy 发表于 2020-4-23 11:56:04

MySQL8.0大师之路:第11章:MySQL服务器管理-11.18 MySQL 慢查询日志

慢查询日志
慢查询日志由SQL语句组成,这些语句执行时间超过long_query_time秒,并且至少需要检查min_examined_row_limit行。慢查询日志可用于查找执行时间较长的查询,因此可以作为优化的候选对象。但是,检查较长的慢查询日志可能是一项耗时的任务。为了使此操作更容易,您可以使用mysqldumpslow命令来处理慢速查询日志文件并总结其内容。获取初始锁的时间不算作执行时间。 mysqld在执行后和释放所有锁之后,将一条语句写入慢速查询日志,因此日志顺序可能与执行顺序不同。



1.慢查询日志参数
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系统变量。





如果您没有为慢查询日志文件指定名称,则默认名称为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秒窗口开始。

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



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_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,也不会添加到从服务器的慢速查询日志中。



2.慢查询日志内容
启用慢查询日志后,服务器会将输出写入到log_output系统变量指定的任何目标。如果启用日志,则服务器将打开日志文件并向其中写入启动消息。但是,除非选择了FILE日志目标,否则不会进一步查询查询文件。如果目标为NONE,则即使启用慢速查询日志,服务器也不会写入任何查询。如果未选择FILE作为输出目标,则设置日志文件名对日志记录无效。如果启用了慢速查询日志,并且选择了FILE作为输出目标,则写入日志的每个语句都以一行开头,该行以#字符开头,并具有以下字段(所有字段都位于一行中):

•Query_time:持续时间。
语句执行时间,以秒为单位。
•Lock_time:持续时间。
获取锁的时间(以秒为单位)。
•Rows_sent:N 。
发送给客户端的行数。
•Rows_examined:
服务器层检查的行数(不计算存储引擎内部的任何处理)。
启用log_slow_extra系统变量(自MySQL 8.0.14起可用)会导致服务器将以下额外字段(除了刚刚列出的字段)写入FILE输出中(不影响TABLE输出)。一些字段描述涉及状态变量名称。有关更多信息,请查阅状态变量描述。但是,在慢查询日志中,计数器是每个语句的值,而不是累积的永久值。
•Thread_id:ID
语句线程标识符。
•Errno:error_number
语句错误号;如果未发生错误,则返回0。
•Killed:
如果语句终止,则错误号指示原因。或者 如果语句正常终止,返回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:时间戳
语句执行的开始时间。
•End:时间戳
记语句执行的结束时间。



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


写入慢速查询日志文件的每个语句之前都有一个包含时间戳的SET语句。从MySQL 8.0.14开始,时间戳指示慢速语句何时开始执行。在8.0.14之前,时间戳指示慢速语句的记录时间(在该语句完成执行之后发生)。


服务器将重写写入慢速查询日志的语句中的密码,以使之不会以纯文本的形式出现。






页: [1]
查看完整版本: MySQL8.0大师之路:第11章:MySQL服务器管理-11.18 MySQL 慢查询日志