MySQL 慢查询日志开启与分析方法
该文章由AI生成,仅为SEO优化测试,相关内容不保证准确!!!
引言
网站变慢,八成和数据库有关。慢查询日志(slow query log)是定位慢 SQL 的第一工具:它记录所有执行超过阈值的语句,配合 EXPLAIN 就能找到优化方向。
一、开启慢查询日志
先看当前状态:SHOW VARIABLES LIKE 'slow_query%'; 与 SHOW VARIABLES LIKE 'long_query_time';。临时开启(重启失效):SET GLOBAL slow_query_log=ON; SET GLOBAL long_query_time=0.5; SET GLOBAL slow_query_log_file='/var/log/mysql/slow.log';。永久生效则写入 my.cnf 的 [mysqld] 段后重启。阈值建议从 0.5 秒起步,优化到一定程度再降到 0.1 秒。另外两个有用的开关:log_queries_not_using_indexes=ON 记录未走索引的查询;log_throttle_queries_not_using_indexes 限制每分钟记录条数防止日志爆炸。
二、用 mysqldumpslow 分析
慢日志是纯文本,直接看效率低。MySQL 自带分析工具:mysqldumpslow -s t -t 10 /var/log/mysql/slow.log 列出总耗时最高的 10 条(-s t 按总时间排序,也可用 -s c 按次数、-s at 按平均时间);-g 'select' 可过滤特定模式。输出会把具体值抽象成 N 和 S,方便聚合同类语句。也可以用 pt-query-digest(Percona Toolkit)得到更详细的报告,包含执行分布与指纹。
三、用 EXPLAIN 定位问题
找到可疑 SQL 后,前面加 EXPLAIN 执行:重点看五个字段——type:ALL 全表扫描最差,至少要到 range 或 ref,理想是 const/eq_ref;key:实际用到的索引,为 NULL 说明没走索引;rows:预估扫描行数,越大越危险;Extra:出现 Using filesort 或 Using temporary 说明有排序/临时表开销;key_len:判断联合索引用了几列。常见修复:给 WHERE/ORDER BY/GROUP BY 字段建索引;联合索引遵循最左前缀;避免在索引列上用函数或隐式类型转换(如字符串列传数字);SELECT * 改为必要列以便走覆盖索引。
四、注意事项
慢日志本身有 IO 开销,生产环境长期开启时阈值不要低于 0.1 秒,并做好日志切割;优化一条 SQL 后务必用真实数据量压测对比,避免在测试库看不出差异;不要盲目加索引——每个索引都会拖慢写入并占空间,以慢日志的实际执行频率决定优先级。
总结
慢 SQL 优化的闭环是:开慢日志 → mysqldumpslow 找 TOP → EXPLAIN 看执行计划 → 加索引/改写 SQL → 复测对比。把这个流程跑熟,数据库性能问题就不再靠猜。