赞
踩
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中看下:
可通过set global slow_query_log on;这样的命令设置慢查询日志相关参数,也可设置mysql配置文件/etc/my.cnf里配置。
如上是将慢查询日志输出到file中,也可以将其输送到表中,具体的参数为 log_output
更改为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 INDEX
,DROP INDEX
, OPTIMIZE TABLE
,和 REPAIR TABLE语句也记录至慢查询日志;
log_throttle_queries_not_using_indexes
:当log_queries_not_using_indexs参数后,没使用索引的查询SQL蹭蹭的写入man查询日志,导致慢查询日志快速增长,这个参数开启后即可对这些SQL设定速率限制;
log_slow_slave_statements
:主从复制时候不会将复制查询写入慢查询日志。
我以如下SQL语句执行,记录的慢查询日志为例(前提是你开启了慢查询日志功能 set global slow_query_log=on;),慢查询日志默认存储在mysql安装目录中的data目录下且默认以FILE存储
mysql> select sleep(11);
执行完毕后查看慢查询日志文件
如果启用了慢查询日志并将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)
引申阅读:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。