Mysql慢查询日志详解(slow_query_log)

引言

Mysql中比较重要的日志包括二进制日志、relay_log(中继日志)、慢查询日志、redo_log、undo_log等,本篇来聊一聊mysql的慢查询日志。

程序中定位一个执行慢的SQL可以根据慢查询日志,默认情况下,慢查询日志禁用,因为开启慢查询日志或多或少的会对mysql的性能产生一些影响。在慢查询日志功能开启时,只有SQL执行时间超过long_query_time参数值的的语句才会在慢查询日志中记录。long_query_time参数,最小值和默认值分别为0  10,单位为秒。

慢查询日志参数

slow_query_log:是否开启慢查询日志

long_query_time:查询阈值,超过了该阈值则记录到慢查询日志中

log_output:如何存储慢查询日志,可选项:FILE或者TABLE

slow_query_log_file:以FILE类型存储慢查询日志时的存储位置

默认情况下,如果没有为慢查询日志指定名称,默认为host_name-slow.log,下面进入mysql中看下:

Mysql慢查询日志详解(slow_query_log)_第1张图片

可通过set global slow_query_log on;这样的命令设置慢查询日志相关参数,也可设置mysql配置文件/etc/my.cnf里配置。

如上是将慢查询日志输出到file中,也可以将其输送到表中,具体的参数为 log_output

Mysql慢查询日志详解(slow_query_log)_第2张图片

更改为TABLE存储后,默认存储在mysql.slow_log表中。

其他相关参数:

log_queries_not_using_indexes:取值on或者off,慢查询日志是否包含不使用索引进行查找的查询,通俗点说就是没使用到索引的查询SQL均会记录到慢查询日志中;

log-short-format:开启此参数后,服务器会将较少(更加紧凑)的日志信息写入慢查询日志,节约磁盘空间;

log_slow_admin_statements:启用该参数后后会将 ALTER TABLE, ANALYZE TABLE, CHECK TABLE, CREATE INDEXDROP INDEX, OPTIMIZE TABLE,和 REPAIR TABLE语句也记录至慢查询日志;

log_throttle_queries_not_using_indexes :当log_queries_not_using_indexs参数后,没使用索引的查询SQL蹭蹭的写入man查询日志,导致慢查询日志快速增长,这个参数开启后即可对这些SQL设定速率限制;

 log_slow_slave_statements :主从复制时候不会将复制查询写入慢查询日志。

Mysql慢查询日志示例内容

我以如下SQL语句执行,记录的慢查询日志为例(前提是你开启了慢查询日志功能 set global slow_query_log=on;),慢查询日志默认存储在mysql安装目录中的data目录下且默认以FILE存储

mysql> select sleep(11);

执行完毕后查看慢查询日志文件

Mysql慢查询日志详解(slow_query_log)_第3张图片

如果启用了慢查询日志并将FILE其选为输出目标,则写入日志的每个语句前面都有一个以#字符开头 且包含这些字段的行(所有字段都在一行中):

  • Query_time: duration

    语句执行时间(以秒为单位)

  • Lock_time: duration

    在几秒钟内获得锁定的时间

  • Rows_sent: N

    发送到客户端的行数。

  • Rows_examined: 

    优化程序检查的行数

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

Mysql慢查询日志是否要开启,请谨慎决策,因为开启慢查询日志后会对mysql性能产生些影响,如果你设置的慢查询日志存储格式为FILE,还会额外消耗线上服务器的磁盘空间。

参考资料:Mysql官网慢查询日志(https://dev.mysql.com/doc/refman/5.7/en/slow-query-log.html)

引申阅读:

Mysql主从复制-基于GTID的复制

Mysql主从复制-基于日志点的复制

你可能感兴趣的:(Mysql)