如何通过慢查询定位瓶颈_mysql性能分析

1次阅读

开启慢查询日志是定位mysql性能瓶颈最直接有效的方式,需配置slow_query_log、long_query_time等参数,结合explain分析执行计划,并用mysqldumpslow或pt-query-digest工具提升分析效率。

如何通过慢查询定位瓶颈_mysql性能分析

开启慢查询日志是定位 MySQL 性能瓶颈最直接有效的方式。它能帮你快速识别执行时间过长、未走索引或扫描行数过多的 SQL,而不是靠猜测或整体监控指标“盲找”问题。

开启并配置慢查询日志

确保慢查询日志已启用,并设置合理阈值(如 1 秒)和记录条件:

  • my.cnfmy.ini 中添加或修改以下参数:

slow_query_log = ON
slow_query_log_file = /var/lib/mysql/slow.log
long_query_time = 1.0
log_queries_not_using_indexes = ON(可选,便于发现缺失索引的查询)
min_examined_row_limit = 1000(可选,只记录扫描超 1000 行的语句,减少日志噪音)

配置后需重启 MySQL 或执行 SET GLOBAL slow_query_log = ON; 动态开启(注意:动态设置在重启后失效)。

分析慢查询日志内容

日志中每条记录包含关键信息:执行时间、锁等待时间、扫描行数、返回行数、SQL 语句本身。重点关注:

  • Query_time:实际执行耗时,超过 long_query_time 才会被记录
  • Lock_time:锁等待时间高,说明存在并发争用(如行锁/表锁冲突)
  • Rows_examinedRows_sent 比值极大(如 10000:1),大概率缺少有效索引或用了低效条件
  • 语句末尾的 SET timestamp=… 可用于关联业务日志定位具体请求时间点

结合 EXPLAIN 定向优化

对慢日志中高频或耗时最长的 SQL,用 EXPLAIN 查看执行计划:

  • 检查 type 字段:避免 ALL(全表扫描),优先 constrefrange
  • 关注 keykey_len:是否命中预期索引?长度是否合理(如前缀索引截断)?
  • 留意 Extra 字段:Using filesortUsing temporary 表示排序/分组未走索引,需优化 ORDER BY 或 GROUP BY 字段
  • 对比 rows 预估与日志中 Rows_examined 是否接近,偏差大可能统计信息过期,可执行 ANALYZE table

辅助工具提升分析效率

手动翻日志效率低,推荐组合使用:

  • mysqldumpslow:MySQL 自带命令,例如 mysqldumpslow -s t -t 10 /var/lib/mysql/slow.log 统计耗时 Top 10
  • pt-query-digest(Percona Toolkit):更强大,支持聚合分析、生成报告、对比不同时间段、输出建议索引等
  • 可视化工具:如 Anemometer(基于 pt-query-digest 结果的 Web 界面),适合团队共享和趋势追踪

不复杂但容易忽略的是:慢查询日志只反映“结果”,必须结合业务上下文(比如某接口在高峰期突增慢查)和执行计划才能准确定位根因。

text=ZqhQzanResources