需执行 SHOW GLOBAL VARIABLES LIKE ‘slow_query_log’ 确认全局启用状态,值为 ON 表示已开启,并通过 slow_query_log_file 查看日志路径;配置须写入 my.cnf 的 [mysqld] 段并重启生效。
如何确认慢查询日志是否已启用并定位日志路径
MySQL 默认不开启慢查询日志,必须手动配置生效。直接查 slow_query_log 变量只能反映当前会话状态,真正要看全局是否启用,得执行:
SHOW GLOBAL VARIABLES LIKE 'slow_query_log';
如果值为 OFF,说明没开;同时检查 slow_query_log_file 的值,它指向实际日志文件路径(如 /var/lib/mysql/slow.log),但该路径可能因 MySQL 启动用户权限不足而写入失败——常见现象是日志文件存在但大小始终为 0。
关键配置项需写在 my.cnf 的 [mysqld] 段落中,并重启服务才生效:
slow_query_log = ON
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 1.0
log_queries_not_using_indexes = OFF
long_query_time 单位是秒,且从 MySQL 5.7 起支持毫秒级(如 0.1),但注意:该阈值对微秒级时间不敏感,实际记录以整数秒四舍五入判断;log_queries_not_using_indexes 开启后会导致大量简单 SELECT 被记录,干扰分析,建议初期关闭。
用 mysqldumpslow 快速提取高频慢查询模式
mysqldumpslow 是 MySQL 自带的解析工具,比直接 grep 或 awk 更可靠,因为它能自动归一化 SQL(把 WHERE id = 123 和 WHERE id = 456 视为同一类)。常用组合:
-
mysqldumpslow -s c -t 10 /var/log/mysql/mysql-slow.log:按出现次数(c)排序,取前 10 条 -
mysqldumpslow -s t -g "SELECT.*FROM orders" /var/log/mysql/mysql-slow.log:筛选含SELECT ... FROM orders的语句,并按总耗时(t)排序
注意:mysqldumpslow 不解析带引号的字符串参数,若 SQL 中有类似 WHERE name = '张三',会被统一为 WHERE name = '?' ,所以归类准确;但如果语句里混用反引号、大小写混乱或空格不一致,仍可能被当作不同模式——建议先用 mysqlbinlog 或第三方工具(如 pt-query-digest)做二次校验。
EXPLAIN 输出中哪些字段真正影响性能判断
对慢查询语句执行 EXPLAIN 后,重点盯住这四个字段: