Jmeter性能测试与SQL优化——电影收藏清单小程序获取收藏列表

📅 2026/7/1 2:14:27 ✍️ 编辑团队 👁️ 阅读次数
Jmeter性能测试与SQL优化——电影收藏清单小程序获取收藏列表
JMeter性能测试与SQL优化完整步骤指南一、准备工作1.1 确认后端服务运行1.2测试环境隔离1.2.1使用本地数据库——创建测试数据库-- 创建测试数据库CREATE DATABASE IF NOT EXISTS movie_collection_testCHARACTER SET utf8mb4COLLATE utf8mb4_unicode_ci;-- 使用测试库USE movie_collection_test;-- 导入生产表结构只导结构不导数据-- 方式1从原库复制表结构CREATE TABLE users LIKE movie_collection.users;CREATE TABLE favorite_movies LIKE movie_collection.favorite_movies;CREATE TABLE watch_plans LIKE movie_collection.watch_plans;CREATE TABLE verification_codes LIKE movie_collection.verification_codes;-- 插入测试数据不要用真实用户数据INSERT INTO users (id, phone, password, nickname) VALUES(1, 13800138000, test123, 测试用户1),(2, 13800138001, test123, 测试用户2);-- 插入大量测试数据用于压测DELIMITER $$CREATE PROCEDURE insert_test_data()BEGINDECLARE i INT DEFAULT 1;WHILE i 5000 DOINSERT INTO favorite_movies (user_id, movie_name, director, rating, release_date, collection_reason, create_time)VALUES (1, CONCAT(测试电影, i), 测试导演, ROUND(RAND()*10,1),DATE_ADD(2020-01-01, INTERVAL FLOOR(RAND()*2000) DAY),CONCAT(测试收藏理由, i), NOW());SET i i 1;END WHILE;END$$DELIMITER ;CALL insert_test_data();-- 验证数据量SELECT COUNT(*) FROM favorite_movies; -- 应有5000条修改后端配置连接测试库创建 .env.test 文件# server/.env.testPORT3001DB_HOSTlocalhostDB_USERrootDB_PASSWORDrootDB_NAMEmovie_collection_testJWT_SECRETtest_secret_key_2026修改server.js内容将读取文件改为.env.test或者直接修改原有的.env文件将连接的数据库改为movie_collection_test其他可不做修改即可。1.2.2使用Docker容器隔离安装Docker 通过启用或关闭windows功能打开虚拟机平台和适用于Linux的Windows子系统WSL在终端中输入wsl –set-default-version 2Wsl –update –web-download安装Docker Desktop for Windows访问 https://www.docker.com/products/docker-desktop/下载 Docker Desktop for Windows安装需要开启Hyper-V或WSL2启动Docker Desktop输入docker -v出现版本号即成功了。使用docker时后端要挂着Docker Desktop创建测试数据库容器# 拉取MySQL镜像docker pull mysql:8.0# 创建测试数据库容器端口映射到3307docker run -d \--name movie_collection_test_db \-p 3307:3306 \-e MYSQL_ROOT_PASSWORDroot \-e MYSQL_DATABASEmovie_collection_test \mysql:8.0 \--character-set-serverutf8mb4 \--collation-serverutf8mb4_unicode_ci参数作用docker run -d后台运行容器-d detached分离模式不占用终端--name movie_collection_test_db给容器命名为 movie_collection_test_db方便后续管理-p 3307:3306端口映射主机的 3307 端口 → 容器的 3306 端口MySQL 默认端口-e MYSQL_ROOT_PASSWORDroot设置 MySQL root 用户密码为 root环境变量-e MYSQL_DATABASEmovie_collection_test容器启动时自动创建名为 movie_collection_test 的数据库mysql:8.0使用官方 MySQL 8.0 版本镜像--character-set-serverutf8mb4设置服务器默认字符集为 utf8mb4支持 emoji、全语种最佳实践--collation-serverutf8mb4_unicode_ci设置排序规则支持通用 Unicode 排序连接测试数据库# 进入容器docker exec -it movie_collection_test_db mysql -uroot -proot# 或通过Navicat连接# 主机127.0.0.1# 端口3307# 用户名root# 密码1234问你的性能测试是怎么隔离环境的你我使用的是Docker容器隔离。在本地用Docker创建了一个独立的MySQL测试容器映射到3307端口数据库名也用movie_collection_test区分。这样无论怎么压测都不会影响真实环境。这种方式的好处是环境干净、可重复、而且用完可以直接销毁容器非常适合做性能测试。二、使用JMeter进行压测2.1 下载并安装JMeter访问 https://jmeter.apache.org/download_jmeter.cgi下载 apache-jmeter-5.6.3.zip解压到任意目录如 D:\jmeter进入 bin 目录双击 jmeter.bat 启动2.2 创建测试计划步骤右键点击 测试计划 → 添加 → 线程用户 → 线程组线程组配置参数值说明线程数50模拟50个并发用户Ramp-Up时间55秒内启动所有线程循环次数10每个用户执行10次请求总请求数50 × 10 500共500个请求2.3 添加HTTP请求步骤右键点击 线程组 → 添加 → 取样器 → HTTP 请求配置如下参数值协议http服务器名称或IP127.0.0.1端口号3000方法GET路径/api/favorite/list2.4 添加HTTP Header Manager添加认证Token步骤右键点击 HTTP请求 → 添加 → 配置元件 → HTTP信息头管理器添加Header名称 值Authorization Bearer 你的登录token如何获取token1、先用Postman登录复制返回的token2、在Jmeter中自动关联Token整体流程图步骤1添加登录请求右键点击线程组 → 添加 → 取样器 → HTTP请求配置登录请求参数值名称01-登录获取Token协议http服务器127.0.0.1端口3000方法POST路径/api/loginBody{phone:13800138000,loginType:password,password:xiaoming123}注可以添加一个HTTP请求默认值这样每次写接口的时候不用重复写协议、IP、端口号。步骤2添加HTTP 信息头管理器右键登录请求 → 添加 → 配置元件 → HTTP 信息头管理器添加 1 行名称Content-Type值application/json步骤3添加JSON提取器提取Token右键点击登录请求 → 添加 → 后置处理器 → JSON提取器参数值名称tokenJSON表达式$.data.token匹配编号1变量名token注$.data.token 表示从响应JSON中提取data.token的值变量名token会存储提取的值后续用${token}引用原线程HTTP请求中添加请求头先设置线程数为1测试一次查看结果树通过2.5 添加监听器查看结果步骤右键点击 线程组 → 添加 → 监听器 → 查看结果树查看每个请求详情右键点击 线程组 → 添加 → 监听器 → 聚合报告查看汇总统计2.6 运行测试点击绿色▶️按钮启动测试等待测试完成约10-20秒2.7 查看聚合和汇总报告指标含义优化前预期值Average平均响应时间约1200msMin最小响应时间约800msMax最大响应时间约2000msThroughput吞吐量QPS约40-50三、定位慢SQL3.1 开启MySQL慢查询日志方法一临时开启重启失效-- 查看当前慢查询状态SHOW VARIABLES LIKE slow_query_log%;SHOW VARIABLES LIKE long_query_time;-- 开启慢查询日志SET GLOBAL slow_query_log ON;-- 设置慢查询阈值1秒SET GLOBAL long_query_time 1;-- 设置日志文件路径WindowsSET GLOBAL slow_query_log_file D:/application/mysql-9.0.1-winx64/data/slow.log;3.2 分析慢查询日志压测后查看慢查询日志找到收藏列表的SQL在我们刚生成的log日志文件中可查看找到类似的语句# 慢查询日志示例# Time: 2026-03-27T10:00:00.000000Z# Query_time: 1.234 Lock_time: 0.001 Rows_sent: 10 Rows_examined: 15000SELECT * FROM favorite_movies WHERE user_id 1 ORDER BY create_time DESC LIMIT 10 OFFSET 0;关键信息Rows_examined: 15000 - 扫描了15000行数据Query_time: 1.234 - 查询耗时1.2秒3.3 使用EXPLAIN分析SQL-- 分析SQL执行计划EXPLAIN SELECT * FROM favorite_movies WHERE user_id 1 ORDER BY create_time DESC LIMIT 10 OFFSET 0;EXPLAIN结果解读字段值说明typeALL全表扫描性能最差possible_keysNULL没有可用索引keyNULL没有使用索引rows15000扫描了4905行四、优化SQL添加索引4.1 添加联合索引-- 添加联合索引user_id create_timeALTER TABLE favorite_movies ADD INDEX idx_user_create (user_id, create_time);-- 验证索引是否创建成功SHOW INDEX FROM favorite_movies WHERE Table favorite_movies;4.2 再次使用EXPLAIN验证EXPLAIN SELECT * FROM favorite_movies WHERE user_id 1 ORDER BY create_time DESC LIMIT 10 OFFSET 0;优化后的EXPLAIN结果字段值说明typeref索引查找性能好possible_keysidx_user_create有可用索引keyidx_user_create使用了索引rows15只扫描15行减少1000倍五、再次压测验证5.1 重新运行JMeter压测确保已添加索引重新运行相同的测试计划查看聚合报告5.2 对比优化前后数据指标优化前优化后提升Average1200ms300ms↓ 75%Min800ms150ms↓ 81%Max2000ms500ms↓ 75%Throughput45 req/s180 req/s↑ 300%QPS提升45 → 180提升了4倍六、完整操作命令汇总-- 1. 查看当前数据量SELECT COUNT(*) FROM favorite_movies WHERE user_id 1;-- 2. 开启慢查询日志可选SET GLOBAL slow_query_log ON;SET GLOBAL long_query_time 1;-- 3. 分析SQL优化前EXPLAIN SELECT * FROM favorite_movies WHERE user_id 1 ORDER BY create_time DESC LIMIT 10 OFFSET 0;-- 4. 添加联合索引ALTER TABLE favorite_movies ADD INDEX idx_user_create (user_id, create_time);-- 5. 再次分析SQL优化后EXPLAIN SELECT * FROM favorite_movies WHERE user_id 1 ORDER BY create_time DESC LIMIT 10 OFFSET 0;-- 6. 查看索引SHOW INDEX FROM favorite_movies;-- 7. 删除测试数据可选DELETE FROM favorite_movies WHERE movie_name LIKE 测试电影%;七、面试时如何回答这个问题我用JMeter对收藏列表接口做了压力测试模拟50个并发用户每个用户执行10次请求发现平均响应时间1.2秒吞吐量只有45 QPS。然后我开启了MySQL慢查询日志发现这个查询每次要扫描1万多行数据。用EXPLAIN分析后发现SQL没有使用索引。我分析了业务场景用户查询收藏时总是按用户ID过滤、按时间排序所以给 user_id 和 create_time 建了联合索引。优化后再次压测响应时间降到300毫秒QPS提升到180提升了4倍。这个案例让我深刻理解了索引对查询性能的重要性也学会了用JMeter和慢查询日志定位性能瓶颈的方法。八、注意事项事项说明测试环境隔离不要在生产环境做压测用本地或测试库数据准备测试数据量要足够大至少1000条否则看不出效果多次测试取多次测试的平均值避免单次偶然性监控服务器压测时观察CPU、内存使用情况避免压垮服务器最后下方这份完整的软件测试 视频教程已经整理上传完成需要的朋友们可以自行领取【保证100%免费】​​​软件测试面试文档我们学习必然是为了找到高薪的工作下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料并且有字节大佬给出了权威的解答刷完这一套面试资料相信大家都能找到满意的工作。