MySQL 慢查询说明

官方文档:

https://dev.mysql.com/doc/refman/5.7/en/slow-query-log.html

1、

慢查询语句由SQL语句组成,这些语句执行时间要超过 long_query_time 参数设置后,并且扫描行数要超过 min_examined_row_limit 参数设置后,才被会记录。

long_query_time 默认值是10,最小值可以设置为0

min_examined_row_limit  默认值是0

2、

获取锁的时间不算做执行时间,(这个锁包括行锁和MDL锁),语句在等待锁释放后,并且执行完成后,才会写入到慢查询日志中,因此日志顺序可能和执行顺序是不一样的。

3、

log_slow_admin_statements  数据库管理语句( ALTER TABLE, ANALYZE TABLE, CHECK TABLE, CREATE INDEX, DROP INDEX, OPTIMIZE TABLE,和 REPAIR TABLE

这个参数默认是OFF,但optimize table命令执行时间超过慢查询

 log_queries_not_using_indexes 数据库查询不走索引的语句

默认情况下这两个参数都是关闭的。

4、 

--slow_query_log 参数值是0或1

这个参数默认是关闭的,如果这个参数未设置值或设置的值为1,代表慢查询打开。

5、

slow_query_log_file=file_namelog_output

如果需要指定输出的文件名,请修改此变量,默认是 host_name-slow.log
 
6、

log_throttle_queries_not_using_indexes 

当开启log_queries_not_using_indexes 参数后,慢查询日志可能会迅速增涨,通过设置log_throttle_queries_not_using_indexes 变量,可以限制记录这类查询数量 ,默认情况下,这个参数值为0,代表着不限制,修改此参数为其它值后,记录第一个查询后,会开启一个60秒的窗口期,如果存在被限制的查询,在60秒窗口期过后,slow_log中会记录一个摘要,该摘要显示有多少查询以及在这些查询中花费的总时间。当服务器记录下一个不使用索引的查询时,下一个60秒窗口期开始。

修改此参数为2,

连接执行n次,select * from t1; --这种语句肯定是全表扫描,不走索引。

slow_log中只会记录前两次,后边的不做记录,

过一分钟后,我再继续执行select * from t1;发现还没做记录

我执行select * from t2; 发现摘要信息出现了【throttle:          4 'index not used' warning(s) suppressed.;】

7、

慢查询根据以以下顺序,决定是否记录到慢查询中:

  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 设置禁止查询 

  

8、

log_timestamps 参数决定了写入慢查询日志中的时间,以及一般查询日志和错误日志。

9、

服务器不记录查询缓存处理的查询。

 

10、

默认情况下,慢查询不记录从主库同步过来执行的慢SQL,要修改此设置,需要启用log_slow_slave_statements变量,如果binlog_for=row则无效,仅在binlog_format=STATEMENT设置或何时binlog_format=MIXED设置并且以语句格式记录语句才有效。

 

11、

开启慢查询后,慢查询记录到文件或slow_log表中是由log_output 参数决定的,如果是FILE,就记录到文件中,如果是TABLES就记录到mysql.slow_log表中。如果是NONO,即使开启了慢查,也不会做记录。

12、

如果启用了慢查询日志并将FILE其选择为输出目标,则写入日志的每个语句都以一行开头,该行以#字符开头 并具有以下字段(所有字段都在一行上):

  • Query_time: duration

    语句执行时间,以秒为单位。

  • Lock_time: duration

    获取锁的时间(以秒为单位)。(包含行锁和MDL锁时间)

  • Rows_sent: N

    发送给客户端的行数。

  • Rows_examined:

    服务器层检查的行数(不计算存储引擎内部的任何处理)。

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

原文地址:https://www.cnblogs.com/nanxiang/p/13058306.html