MySQL慢查询日志是用于记录执行时间超过预设阈值的SQL语句的日志工具,主要用于定位性能瓶颈,辅助SQL优化。
一、核心概念与作用
慢查询日志通过记录执行时间超过long_query_time阈值的SQL语句,帮助开发者快速识别低效查询。其核心价值在于:
- 批量分析性能问题:无需逐条执行EXPLAIN,直接从日志中筛选耗时SQL。
- 精准优化:结合EXPLAIN分析执行计划,判断是否因索引缺失、索引失效或数据量过大导致性能下降。
- 灵活阈值设置:根据业务场景调整long_query_time(如设置为0.1秒),平衡日志量与优化优先级。
二、关键参数与配置
- 慢查询日志开关:
全局变量slow_query_log控制开关状态,默认关闭。需通过命令SET GLOBAL slow_query_log = ON;启用,修改后影响所有会话。 - 时间阈值:
long_query_time定义慢查询标准,单位为秒,默认10秒。可通过SET SESSION long_query_time = 0.1;设置当前会话阈值,避免全局修改影响其他业务。 - 日志路径:
默认路径为/var/lib/mysql/,可通过slow_query_log_file变量自定义文件名。 - 其他参数:
log_queries_not_using_indexes可记录未使用索引的查询,辅助索引优化。
三、实践流程
- 启用日志:
执行SET GLOBAL slow_query_log = ON;,确认无报错(需权限)。 - 设置阈值:
根据压测结果调整long_query_time,例如设置为0.1秒以捕获微秒级延迟。 - 执行压测:
模拟真实业务负载,触发慢查询生成日志。 - 分析日志:
通过日志文件或命令SELECT * FROM mysql.slow_log;(需开启log_output=TABLE)查看慢查询列表。 - 优化SQL:
对高频慢查询执行EXPLAIN,检查是否全表扫描、索引选择是否合理。例如,若发现WHERE password=...未使用索引,需为password字段添加索引并确保类型匹配。
四、补充工具:SHOW PROFILES
MySQL默认仅显示查询时间的两位小数,开启profiling可获取更详细耗时:
- 执行SET profiling = 1;启用当前会话分析。
- 运行SQL后,通过SHOW PROFILES;查看各阶段耗时,定位具体瓶颈(如排序、临时表创建)。
总结:慢查询日志是MySQL性能调优的核心工具,通过合理配置阈值、结合EXPLAIN与PROFILING,可系统化解决SQL执行效率问题。建议定期分析日志并建立优化闭环,持续提升数据库性能。