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_name
log_output
host_name
-slow.log
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、
慢查询根据以以下顺序,决定是否记录到慢查询中:
-
该查询必须不是管理语句,或者
log_slow_admin_statements
必须启用。 -
该查询必须至少花费了
long_query_time
几秒钟的时间,或者log_queries_not_using_indexes
必须启用并且该查询未使用任何索引进行行查找。 -
该查询必须至少检查了
min_examined_row_limit
行。 -
不得根据
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
包含时间戳的语句,该时间戳记指示慢速语句的记录时间(该语句在执行完成之后发生)。