MySQL 慢查询分析生命周期

MySQL配置
日志收集
日志分析
性能优化
效果验证

1. MySQL 慢查询配置

1.1 开启慢查询日志

在 MySQL 配置文件中添加以下配置:

[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
log_queries_not_using_indexes = 1
log_throttle_queries_not_using_indexes = 60

1.2 动态修改配置

使用命令行临时修改配置:

SET GLOBAL slow_query_log = 'ON';
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
SET GLOBAL long_query_time = 1;

1.3 配置建议

  • 建议将 long_query_time 设置为 5 秒或更短
  • 定期清理或轮转日志文件,避免占用过多磁盘空间
  • 考虑使用 log_queries_not_using_indexes 捕获未使用索引的查询

2. 日志收集与导出

2.1 日志文件管理

  • 定期备份日志文件
  • 使用 logrotate 进行日志轮转
  • 为不同的应用或时期使用不同的日志文件

2.2 导出方式

# 复制日志文件
cp /var/log/mysql/slow.log /backup/slow_$(date +%Y%m%d).log

# 清空当前日志
mysqladmin flush-logs

3. 日志分析方法

3.1 使用本工具分析

  • 上传日志文件进行可视化分析
  • 使用时间分布热力图查看查询密集时段
  • 通过关键字和时间范围筛选特定查询
  • 导出分析结果供团队讨论

3.2 其他分析工具

  • 使用 mysqldumpslow 进行命令行分析
  • 使用 pt-query-digest 进行深度分析
  • 结合 EXPLAIN 分析具体查询计划

4. 性能优化策略

4.1 索引优化

  • 为常用查询条件创建合适的索引
  • 删除重复或未使用的索引
  • 优化复合索引顺序
  • 定期维护索引统计信息

4.2 查询优化

  • 优化 JOIN 策略和顺序
  • 减少子查询,使用 JOIN 替代
  • 使用覆盖索引减少回表
  • 优化 GROUP BY 和 ORDER BY

4.3 架构优化

  • 使用读写分离
  • 实施分库分表
  • 利用缓存减少数据库压力
  • 优化数据库参数配置

5. 优化效果验证

5.1 性能指标监控

  • 比较优化前后的查询响应时间
  • 监控 QPS 和 TPS 变化
  • 观察系统资源使用情况
  • 分析慢查询数量变化

5.2 持续优化建议

  • 建立性能基准数据
  • 定期进行性能评估
  • 保持优化文档更新
  • 进行压力测试验证