当前位置: 首页 > ai >正文

性能测试工具-Slow Query Log

一、它是什么?为什么测试工程师必须掌握?

慢查询日志 是 MySQL 内置的一种日志功能,用于记录执行时间超过指定阈值(long_query_time)的所有 SQL 语句。

对你(测试工程师)的核心价值:

  1. 精准定位瓶颈:当性能测试发现接口响应慢时,能快速判断是否是数据库拖慢了后腿,并直接揪出“元凶”SQL

  2. 提供无可辩驳的证据:在提交给开发的 Bug 报告中,附上一条具体的慢 SQL 及其执行时间,比单纯说“接口慢了 2 秒”更有力。

  3. 优化效果验证:在开发对 SQL 进行优化(如加索引)后,你可以再次执行测试,通过对比优化前后慢日志中该 SQL 的执行时间,量化验证优化的效果

  4. 发现潜在问题:可以发现那些在测试数据量小时运行正常,但上线后随着数据量增长必然会出问题的 SQL(如全表扫描)。

如何配置与开启(测试环境)

慢查询日志默认是关闭的,需要在测试环境的 MySQL 配置中开启。

1. 临时开启(重启失效,适合临时测试)

@sql

-- 1. 查看慢查询日志相关参数(确认当前状态)
SHOW VARIABLES LIKE 'slow_query%';
SHOW VARIABLES LIKE 'long_query_time';-- 2. 开启慢查询日志
SET GLOBAL slow_query_log = 'ON';-- 3. 设置慢查询时间阈值(单位:秒),例如设置超过1秒就算慢查询
SET GLOBAL long_query_time = 1;-- 4. 设置日志文件路径(可选,不设置则使用默认位置)
SET GLOBAL slow_query_log_file = '/var/lib/mysql/slow.log';

2. 永久生效(修改配置文件)
修改 MySQL 的配置文件 my.cnf (Linux) 或 my.ini (Windows):

@ini

[mysqld]
# 开启慢查询日志
slow_query_log = 1
# 指定慢查询日志文件路径
slow_query_log_file = /var/lib/mysql/slow.log
# 设置慢查询时间阈值(0.1秒=100毫秒,对高性能应用很常见)
long_query_time = 0.1
# 记录未使用索引的查询(非常重要!即使执行快也可能是潜在问题)
log_queries_not_using_indexes = 1

修改后需要重启 MySQL 服务。

测试环境建议:将 long_query_time 设置得小一些(如 0.1 秒),以便捕获更多潜在问题的 SQL。切勿在生产环境轻易设置 log_queries_not_using_indexes,否则日志量可能会巨大。


三、如何分析慢查询日志(核心技能)

日志内容看起来可能很乱,但核心是抓住几个关键信息。一条典型的慢日志记录如下:

@sql

# Time: 2023-10-27T06:12:13.123456Z
# User@Host: test_engineer[test_engineer] @  [192.168.1.100]  Id:  1234
# Query_time: 12.345678  Lock_time: 0.001234 Rows_sent: 10  Rows_examined: 10000000
SET timestamp=1698387133;
SELECT * FROM `orders` WHERE `status` = 'pending' AND `create_time` > '2023-10-20' ORDER BY `id` DESC;

作为测试工程师,你需要关注这些字段:

字段示例值含义与分析给开发的建议方向
Query_time12.345678SQL 实际执行时间(单位:秒)。这是最直接的证据。“这条 SQL 执行了 12 秒,导致接口超时。”
Rows_examined10000000****SQL 执行过程中扫描了多少行数据。这是关键中的关键!“为获取10条结果,扫描了1000万行,怀疑缺失有效索引。”
Rows_sent10返回给了客户端多少行数据。对比 Rows_examined,比值越小问题越大。
Lock_time0.001234等待锁的时间。如果这个时间很长,说明存在严重的锁竞争。“事务持有锁时间过长,可能并发逻辑有问题。”
SET timestamp1698387133SQL 执行的具体时间点。可以和你性能测试工具(如 JMeter)的报告时间点关联。“在晚高峰压测期间,此SQL频繁出现。”
SQL 语句SELECT * FROM ...****问题的根本“建议为 status 和 create_time 字段添加联合索引。”

分析方法:

  1. 直接查看:如果日志不大,可以用 vimless 等命令直接查看,但效率低。

  2. 使用官方工具 mysqldumpslow:MySQL 自带的摘要分析工具,可以对日志进行归类统计。

    @bash

    # 得到返回记录集最多的10条SQL
    mysqldumpslow -s r -t 10 /var/lib/mysql/slow.log# 得到访问次数最多的10条SQL
    mysqldumpslow -s c -t 10 /var/lib/mysql/slow.log# 得到按照时间排序,并且包含'select'的前10条SQL
    mysqldumpslow -s t -t 10 -g "select" /var/lib/mysql/slow.log
  3. 使用更强大的第三方工具 pt-query-digest:这是 Percona Toolkit 中的王牌工具,是分析慢查询日志的行业标准,强烈推荐。

    @bash

    pt-query-digest /var/lib/mysql/slow.log > slow_report.txt

    它会生成一份非常详细的报告,包括:

    • 总的查询时间和占比(哪些 SQL 拖慢了整个系统)

    • 单个查询的统计信息(执行次数、最小/最大/平均时间)

    • 执行时间的分布直方图


四、在性能测试工作流中的应用

  1. 测试前:在测试环境数据库中开启慢查询日志,并设置合理的阈值。

  2. 测试中:使用 JMeter、LoadRunner 等工具执行性能测试场景(如高并发下单、批量查询)。

  3. 测试后

    • 停止压测。

    • 使用 pt-query-digest 分析慢日志,生成报告。

    • 将报告中最耗时的 TOP N SQL 及其详细分析(扫描行数、执行时间等)作为附件,提交到性能 Bug 中。

    • 在 Bug 描述中,清晰地将接口性能问题与具体的 SQL 瓶颈关联起来。

  4. 回归验证

    • 开发修复(如添加索引、优化 SQL 逻辑)后。

    • 同一测试环境、相同测试数据和相同测试场景下再次执行性能测试。

    • 对比优化前后的慢日志:

      • 如果该 SQL 从未在日志中出现 → 优化成功。

      • 如果执行时间显著降低(如从 10s 降到 0.1s)→ 优化成功。

      • 如果 Rows_examined 大幅减少 → 优化成功。

五、总结与建议

  • 慢查询日志是你性能测试的“照妖镜”,能让数据库层面的问题无处遁形。

  • 掌握 pt-query-digest 的使用,让你的分析工作事半功倍,报告更专业。

  • 关注 Rows_examined 和 Query_time 这两个黄金指标。

  • 测试环境可以激进一些(低阈值、记录未使用索引的查询),尽可能多地发现问题。

  • 将慢查询分析作为你性能测试流程中的一个标准环节

http://www.xdnf.cn/news/19333.html

相关文章:

  • React学习教程,从入门到精通, ReactJS - 架构(6)
  • Java GC 销毁机制 与 Redis 过期策略深度对比
  • AI+IP双驱动:效率提升的关键
  • 查漏补缺——与日期有关的字符串
  • SAP Business One的设计哲学
  • Linux 网络编程:深入理解套接字与通信机制
  • 在Windows系统Docker中使用wsl2、容器、windows文件路径三种不同挂载方式的区别和性能差异
  • 大话 IOT 技术(1) -- 架构篇
  • 【代码随想录day 22】 力扣 39. 组合总和
  • 视频理解与行为识别全景综述
  • Multi-Head RAG: Solving Multi-Aspect Problems with LLMs
  • linux 内核 - 常见的文件系统介绍
  • AIA中断控制器IPI的Linux内核实现
  • Qt-Advanced-Docking-System: 一个基于 Qt 框架的高级停靠窗口系统
  • Spring boot注解介绍
  • Python 2025:AI代理、Rust与异步编程的新时代
  • BigDecimal账户分布式原子操作
  • IOT安全学习之IoT_Sec_Tutorial
  • 历史数据分析——寒武纪
  • Wi-Fi技术——MAC特性
  • 【人工智能99问】Qwen3中的QK归一化是什么?(34/99)
  • LeetCode 3459.最长 V 形对角线段的长度:记忆化搜索——就一步步试
  • 备份压缩存储优化方案:提升效率与节省空间的完整指南
  • 鸿蒙开发入门:ArkTS 运算符与分支循环全解析(含实战案例 + 避坑指南)
  • ES6 面试题及详细答案 80题 (13-21)-- 数组与字符串扩展
  • Zynq开发实践(FPGA之平台免费IP)
  • GitHub Spark深度体验:是革命前夜,还是又一个“大厂玩具”?
  • 浅层与深层语义分析的NLP进化论
  • libmodbus移植
  • spi总线