如何在 MySQL 中监控和优化慢 SQL?

Sherwin.Wei Lv7

如何在 MySQL 中监控和优化慢 SQL?

回答重点

可以利用 MySQL 自带的 slow_query_log 来监控慢 SQL,它是 MySQL 提供的一个日志功能,用于记录执行时间超过特定阈值的 SQL 语句。

对于慢查询,再使用 EXPLAIN 分析执行计划,查看查询的执行顺序、使用的索引、扫描的行数等,以识别潜在的性能瓶颈。

基于 EXPLAIN 再进行针对性的优化,常见的优化方向有:

  • 根据 EXPLAIN 的结果,检查是否有合适的索引。若缺失索引,则添加(特别是在 WHERE、JOIN 和 ORDER BY 子句中使用的列上)
  • 将复杂的 JOIN 查询拆分成多个简单查询,尽量小表驱动大表
  • 避免 SELECT * ,仅选择需要的字段
  • 等等(更多可参考扩展中的 SQL 调优)

扩展知识

MySQL SQL 调优

MySQL 索引失效场景汇总

MySQL 慢 SQL 配置

在 MySQL 配置文件(通常是 my.cnf 或 my.ini)中添加或修改以下配置项:

1
2
3
4
5
[mysqld]
slow_query_log = 1 # 启用慢查询日志
slow_query_log_file = /var/log/mysql/mysql-slow.log # 指定慢查询日志文件路径
long_query_time = 2.0 # 设置慢查询的阈值时间(单位:秒)
log_queries_not_using_indexes = 1 # 记录未使用索引的查询

其中的 2.0 就是 2 秒,当一个 SQL 执行的时间超过 2 秒,就会被记录到慢日志中。

也可以通过 SQL 命令动态设置:

1
2
3
4
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL slow_query_log_file = '/var/log/mysql/mysql-slow.log';
SET GLOBAL long_query_time = 2.0;
SET GLOBAL log_queries_not_using_indexes = 'ON';
Comments