概述
- 将运行时间超过某个阈(念域)值的sql语句记录到文件
- mysql5.1开始可以设置以毫秒为单位的慢查询
- 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