最近在使用MySQL慢日志的过程中发现即使慢SQL的时间已经设置为1秒,但是小于1秒的SQL依然被输出到了慢日志文件中,先说原因:启用了 log_queries_not_using_indexes
如果你在配置中开启了
bash
log_queries_not_using_indexes = ON
那么 即使查询执行时间远小于 long_query_time,只要它没走索引,也会被记入慢日志!
解决方法
检查是否启用了该选项:
bash
SHOW VARIABLES LIKE 'log_queries_not_using_indexes';
如果返回 ON,而你不希望记录未使用索引但很快的查询,请关闭它:
bash
SET GLOBAL log_queries_not_using_indexes = OFF;
并在配置文件中确保:
bash
[mysqld]
log_queries_not_using_indexes = 0
变量作用域
如果上面的配置依然无法解决问题,检查long_query_time 设置未全局生效(会话 vs 全局),执行
bash
SHOW SESSION VARIABLES LIKE 'long_query_time';
如果不是1(需要设置的时间),执行
bash
SET GLOBAL long_query_time = 1;
注意:SET GLOBAL 只影响新建立的连接,不影响已有连接。
查询变量值
经过上面的配置后,查询变量是否生效,执行
bash
SHOW GLOBAL VARIABLES LIKE 'long_query_time';
SHOW SESSION VARIABLES LIKE 'long_query_time';
SHOW VARIABLES LIKE 'log_queries_not_using_indexes';
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'long_query_time';
SHOW VARIABLES LIKE 'slow_query_log_file';
开启慢日志
1、在线开启
bash
-- 尝试设置日志文件路径(MySQL 8.0 支持动态修改,5.7 可能不支持)
SET GLOBAL slow_query_log_file = '/var/log/mysql/mysql-slow.log';
-- 记录超过 1 秒的查询
SET GLOBAL long_query_time = 1;
SET GLOBAL slow_query_log = 'ON';
虽然在线开启了,但 MySQL 重启后会恢复默认。要永久生效,需用到下面的方法。
2、修改配置文件,编辑 my.cnf(通常位于 /etc/my.cnf 或 /etc/mysql/my.cnf),需要重启
bash
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 1
log_queries_not_using_indexes = 0 # 可选:是否记录未使用索引的查询
修改后无需立即重启(需先执行1、在线开启),但下次启动时会沿用配置。