1.MySQL之如何定位慢查询
1.慢查询出现的情况
- 聚合查询
- 多表查询
- 表数据量过大查询
- 深度分页查询
主要就这四种情况
慢查询的表现形式:
页面加载过慢、接口压测响应时间过长(超过1s)
2.如何定位慢查询
方法一: 使用开源工具
- 调试工具: Arthas
- 运维工具: Prometheus、Skywalking
Arthas
类型:命令行调试工具(非可视化)。
用途:针对 Java 应用的运行时诊断(如方法调用追踪、性能分析、热修复等)。
特点:
通过命令行交互,直接连接到 JVM 进行调试。
支持实时查看方法执行耗时(
trace
、watch
命令)、监控线程堆栈等。无图形界面,但能生成文本或日志形式的分析结果。
适用场景:快速定位代码级性能问题(如慢查询的具体方法或 SQL)。
Prometheus
类型:指标监控工具(带可视化能力,但需配合 Grafana)。
用途:采集、存储和告警时间序列数据(如 CPU、内存、HTTP 请求延迟等)。
特点:
通过 Pull 模式收集指标,支持灵活的查询语言(PromQL)。
原生提供简单的 Web UI,但通常需集成 Grafana 实现高级可视化仪表盘。
可监控慢查询的宏观指标(如数据库请求延迟、错误率)。
适用场景:系统级性能监控和趋势分析,需结合其他工具定位具体慢查询。
SkyWalking
类型:APM(应用性能管理)工具(带完整可视化界面)。
用途:分布式链路追踪、服务拓扑分析、慢请求诊断。
特点:
自动追踪请求链路,可视化展示调用关系和耗时(如慢 SQL、慢 API)。
提供丰富的 图形化界面,直接定位到慢查询的代码或数据库语句。
支持与 Prometheus 集成,补充指标监控能力。
适用场景:端到端的性能分析,尤其是微服务架构中的慢查询根因定位。
方法二: mysql自带慢日志
慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志。
如果要开启慢查询日志,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息:
#开启MySQL慢日志查询开关 slow_query_log=1 #设置慢日志的时间为2秒,SQL语句执行时间超过2秒,就会视为查询,记录查询日志 long_query_time=2
配置完毕之后,通过重新启动MVSQL服务器进行测试,查看慢日志文件中记录的信息
/var/lib/mysql/localhost-slow.log
日志格式如下:
# Time: 2023-10-20T14:23:45.123456Z # User@Host: root[root] @ localhost [] Id: 123 # Query_time: 5.002345 Lock_time: 0.000123 Rows_sent: 10 Rows_examined: 100000 SET timestamp=1603196625; SELECT * FROM large_table WHERE status = 'pending' ORDER BY create_time;
关键字段说明
时间标记
# Time:
记录查询发生的时间戳,格式为ISO 8601(可配置)用户信息
# User@Host:
显示执行查询的用户名、主机信息及连接ID格式:
user[username] @ host [ip] Id: connection_id
性能指标
# Query_time:
查询执行总时间(秒)
# Lock_time:
表锁等待时间(秒)
# Rows_sent:
返回给客户端的行数
# Rows_examined:
服务器层检查的行数SQL语句
SET timestamp=
记录查询发生时的Unix时间戳 随后显示完整的SQL语句(可能跨越多行)