参考:http://dev.mysql.com/doc/refman/5.7/en/slow-query-log.html
慢查询日志
在文章“MySQL服务器日志(1)”中,已经提到过与“慢查询日志”启用和输出相关的选项和变量,相关选项如下:
--log-out-put=TABLE,FILE
//输出到文件还是表中,默认是FILE
//对应的系统变量log_output
--slow-query-log=1
//是否启用慢日志记录,1:启用;0或不指定:禁用,默认禁用;
//对应的系统变量slow_query_log
--slow-query-log-file=file_name
//指定保存慢查询日志的文件名称,默认是hostname-slow.log;
//对应的系统变量slow_query_log_file
慢查询的具体含义:查询语句的执行时间和检查行数超过指定阈值的SQL语句。
下面介绍下和慢日志相关的变量及使用。
long_query_time
(1)查询时间超过这个值(单位:秒)时,服务器会对变量Slow_queries加1;
(2)如果开启了慢查询日志,这个查询语句就会被写入慢日志文件中;最小值0,默认值10,可以设置到微秒级别;
(3)如果写入到日志文件,时间值会包括微秒部分,如果写入到表中,时间值只保存整数部分;min_examined_row_limit
查询检查的行数小于该值时,不会记录慢日志,默认值为0;log_slow_admin_statements
默认情况下管理语句和没有使用索引的语句是不会被写入慢日志中的。管理语句包括:ALTER TABLE, ANALYZE TABLE, CHECK TABLE, CREATE INDEX, DROP INDEX, OPTIMIZE TABLE, and REPAIR TABLE.
可以通过设置变量log_slow_admin_statements,把慢的管理语句写入慢日志中:
log_slow_admin_statements = ON //默认OFF
- log_queries_not_using_indexes
可以通过设置变量log_queries_not_using_indexes ,把不用索引的语句写入慢日志中:
log_queries_not_using_indexes = ON //默认OFF
- log_throttle_queries_not_using_indexes
如果没有使用索引的查询语句都写入慢日志中,可能会导致慢日志文件增长太快,可以使用变量log_throttle_queries_not_using_indexes来限制每分钟写入的“没使用索引的语句”的数量,默认值0,表示不限制:
log_throttle_queries_not_using_indexes = 100
当服务器收到这样一条语句时,就会打开一个60s的时间窗口,开始记录这些语句,一旦数量达到限制,就会抑制后面的语句,直到窗口结束。如果窗口结束时,存在被抑制的语句,服务器就会将它们的数量以及总耗时记录在日志中。
- log_timestamps
该变量控制慢日志(包括普通查询日志和错误日志)中时间戳的时区。在5.7.2之前使用的是系统时区SYSTEM,5.7.2之后默认是UTC。
log_timestamps = UTC //默认值,会比中国时间晚,可设置为SYSTEM
该变量不会影响写入到表中日志的时间戳。
5.7.2版本以后每行日志都有一个时间戳;5.7.2版本以前,同一秒写入的所有日志行,只有第一行有时间戳。
- log_slow_slave_statements
默认情况下慢查询日志不会被复制到从服务器上,需要设置,可以设置log_slow_slave_statements来启用,5.7.1之后才有该变量。
被查询缓存处理的查询,不会被写入慢日志中。
可以使用mysqldumpslow命令来分析慢日志文件,具体使用参考:http://dev.mysql.com/doc/refman/5.7/en/mysqldumpslow.html