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

性能测试工具-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.dtcms.com/a/359675.html

相关文章:

  • C/C++ 高阶数据结构 —— 二叉搜索树(二叉排序树)
  • 安装Android Studio
  • DVWA靶场通关笔记-SQL Injection (Impossible级别)
  • 【LeetCode - 每日1题】解数独
  • Tomcat 中部署 Web 应用
  • [灵动微电子 MM32BIN560CN MM32SPIN0280]读懂电机MCU 模拟输入运放放大
  • LangChain Prompt管理核心:PromptTemplate与ChatPromptTemplate全解析
  • 旦旦的农场打卡计划
  • 合约服务架构-OOP 方式
  • Linux系统比较两个​​已排序文件​​的实用工具之comm
  • R3:适用于 .NET 的新一代响应式扩展库,事件订阅流
  • HarmonyOS 应用开发:基于API 12及以上的新特性与实践
  • 视觉大模型与多模态理解
  • MySQL直接启动命令mysqld详解:从参数说明到故障排查
  • 容器seccomp配置文件在云服务器安全策略中的实施规范
  • 基于单片机老人防丢失防摔倒系统/老人健康状态检测系统
  • 神州数码VRRP 原理与配置篇
  • 【lua】二进制数据打包和解析
  • 使用 Python 自动化检查矢量面数据的拓扑错误(含导出/删除选项)
  • 【C++ 】STL详解(六)—手撸一个属于你的 list!
  • Lua基础知识精炼
  • vscode+EIDE+Clangd环境导入keil C51以及MDK工程
  • PortSwigger靶场之Stored XSS into HTML context with nothing encoded通关秘籍
  • AG32 Nano开发板的烧录与调试工具(二)
  • LabVIEW 瀑布图与游标操作
  • Python人工智能机器学习汇总
  • MySQL 常用语法
  • CTFshow系列——命令执行web69-72
  • 贝叶斯分类(Bayes Classify)
  • 【嵌入式DIY实例】-空中鼠标