概述

  1. 将运行时间超过某个阈(念域)值的sql语句记录到文件
  2. mysql5.1开始可以设置以毫秒为单位的慢查询
  3. mysql5.5开始可以将慢查询保存到表

开启慢日志

slow_query_log

开启慢日志功能,慢日志中也会记录以下mysql系统内部系统的一些慢日志,好像没法指定说只记录某个数据库的慢日志,可以通过sql语句在线调整:

-- 开启sql日志功能
set global slow_query_log = on;

long_query_time

慢sql执行时间阈值,单位秒,0.001秒,是大于这个阈值,而不是大于等于,默认是10s

set global long_query_time = 0.001;

slow_query_file

slow_query_log_file:慢日志文件存放的位置,指定慢sql文件名为slow-sql.log,慢sql日志文件保存在mysql/data目录下

set global slow_query_file = "slow-sql.log";

slow.log文件太大如何在线删除?

mv slow.log slow_back.log
# 执行这条sql语句,会关闭之前的slow.log然后重新打开一个新的slow.log句柄,记录到这个新的文件
flush slow logs;
# 然后删除这个日志就好了
rm slow_back.log

错误做法>slow.log 清空日志文件,这样文件句柄没有改变,占用的空间不会被释放

min_examined_row_limit

min_examined_row_limit设置扫描记录少于该值的sql,不记录慢日志

set global min_examined_row_limit = 100;

这个时候,这个语句虽然时间很长,但是没有扫描数据库记录,所以不记录

select sleep(5);

log_queries_not_using_indexes

没有使用索引sql也要记录,建议在测试环境下开启,因为测试环境数据量比较少,没有索引也快,一到线上环境就不一样了

-- 记录没有使用索引的sql
set global log_queries_not_using_indexes=on;
# 配合这个参数,限制每分钟记录没有使用索引的sql语句的次数为10次,避免记录太多
set global log-throttle_queries_not_using_indexes = 10

拓展

使用set global全局设置,再下次数据库连接的时候才会生效,设置后重新开始一个连接

show variables like '%query%';

使用set global全局设置,重启mysql后会失效如果想要持久化配置,需要在my.cnf文件中进行配置,配置全部再mysqld作用域中:

[mysqld]
# 开启
slow_query_log = 1 
slow_query_log_file = slow.log
最后修改:2023 年 12 月 30 日
如果觉得我的文章对你有用,请随意赞赏