测试环境治理之MYSQL索引优化篇
作者:京东物流 李光新
1 治理背景
测试环境这个话题对于开发和测试同学一定不陌生,大家几乎每天都会接触。但是说到对测试环境的印象,却鲜有好评:
•环境不稳定,测试五分钟,排查两小时
•基础建设不全,导致验证不充分,遗漏缺陷
•多人共用,节点堵塞
这些问题在行业内其实屡见不鲜,针对测试环境的治理,不得不引起我们的重视。
首先我们要清晰的认知到,测试环境管理做的不好,不光有严重的质量风险,还会非常影响迭代效率,所以这件事情很重要。那在解决它之前,我们首先要去想想,对于测试环境我们到底有哪些诉求?
很明显,测试环境的定位就是满足产研测的测试需求,保障产品迭代质量。所以从使用类型上,一般要支撑集成测试,系统测试,甚至故障测试等。
而这些环境背后,其实都伴随着非功能性要求 ,重点体现在:
1.从使用者角度
•想用就有,不要等待
•要低维护,高稳定
1.从企业角度
•低成本,高效率
简单总结一下,理想的测试环境应该是:自由连接、随时可用、互访可控。
那么现实中的测试环境又是怎样的呢?所谓“理想很丰满,现实很骨感”,对于一线测试工程师可能会发现,真实的测试环境并非这么理想。
测试同学算是测试环境的主要使用者,对测试环境的管理理应负有直接责任。不过现实中,经常看到的是,测试同学因本身测试任务较多,且测试环境管理也要求具备一定的系统运维能力,导致相对而言,测试同学要想做好测试环境管理,也不容易~
下面就主要给大家分享一次实际工作中的Mysql性能优化实践,与大家共勉~
问题点:物流中台运单waybill.etms应用,由于包裹表未使用索引,导致的cpu飚高问题
2 分析过程
1.不管是在日常自动化测试还是功能测试过程中,经常会遇到数据库数据落库比较慢的场景,不仅影响功能测试进度,还会影响自动化的执行时长和成功率,在此背景下,展开如下排查工作~
2.查询两个异常运单,发现数据落库在十分钟以上,展开分析,

3.发现都是查询delivery_package_d抛出异常,怀疑是不是共性问题;
ybill_log.log:2022-03-17 14:42:03 ERROR com.jd.etms.waybill.worker.business.WaybillCreateFromBusiLogic handling:65 - Bus运单JDVE00001018005接货平台下发处理异常
waybill_log.log-org.springframework.jdbc.UncategorizedSQLException:
waybill_log.log-### Error querying database. Cause: com.mysql.jdbc.exceptions.MySQLTimeoutException: Statement cancelled due to timeout or client request
waybill_log.log-### The error may exist in mybatis/mysql/DeliveryPackageDDao.xml
waybill_log.log-### The error may involve defaultParameterMap
waybill_log.log-### The error occurred while setting parameters
waybill_log.log-### SQL: select package_id,package_barcode,waybill_code,vendor_barcode,good_weigth,good_volume,remark, create_time,update_time,yn,again_weight,weigh_User_Name,weigh_Time,pack_time,again_weight_volume,package_state,data_version,flag,expected_delivered_time,packwk_no,store_id,cky2 from delivery_package_d where waybill_code=? and yn=1
waybill_log.log-### Cause: com.mysql.jdbc.exceptions.MySQLTimeoutException: Statement cancelled due to timeout or client request
waybill_log.log-; uncategorized SQLException for SQL []; SQL state [null]; error code [0]; Statement cancelled due to timeout or client request; nested exception is com.mysql.jdbc.exceptions.MySQLTimeoutException: Statement cancelled due to timeout or client request
waybill_log.log- at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:83) ~[spring-jdbc-3.2.18.RELEASE.jar:3.2.18.RELEASE]
4.直接搜异常日志关键字,“接货平台下发处理异常”,确认推测正确;

5.排查异常sql:
waybill_log.log-### SQL: select package_id,package_barcode,waybill_code,vendor_barcode,good_weigth,good_volume,remark, create_time,update_time,yn,again_weight,weigh_User_Name,weigh_Time,pack_time,again_weight_volume,package_state,data_version,flag,expected_delivered_time,packwk_no,store_id,cky2 from delivery_package_d where waybill_code=? and yn=1
waybill_log.log-### Cause: com.mysql.jdbc.exceptions.MySQLTimeoutException: Statement cancelled due to timeout or client request
从上面sql中可以定位到,是查询表delivery_package_d时出现了问题,而且是执行超时,不是连接超时,所以可以排除是连接的问题,与研发沟通,怀疑是索引的问题;
6.然后排查数据库索引:

运单数据库是分库分表的,上述包裹表delivery_package_d有两个表比另外两个表,少了两个索引,定位异常问题,然后添加索引;
ALTER TABLE waybill_0.`delivery_package_d_0` ADD INDEX `idx_package` USING BTREE(`PACKAGE_BARCODE`);
ALTER TABLE waybill_0.`delivery_package_d_0` ADD INDEX `idx_waybill_code` USING BTREE(`WAYBILL_CODE`);
ALTER TABLE waybill_0.`delivery_package_d_0` ADD INDEX `idx_waybill_code_package` USING BTREE(`WAYBILL_CODE`, `PACKAGE_BARCODE`);
ALTER TABLE waybill_0.`delivery_package_d_0` ADD PRIMARY KEY USING BTREE(`PACKAGE_ID`, `CREATE_TIME`);
ALTER TABLE waybill_0.`delivery_package_d_1` ADD INDEX `idx_waybill_code` USING BTREE(`WAYBILL_CODE`);
ALTER TABLE waybill_0.`delivery_package_d_1` ADD INDEX `idx_waybill_code_package` USING BTREE(`WAYBILL_CODE`, `PACKAGE_BARCODE`);
ALTER TABLE waybill_0.`delivery_package_d_1` ADD PRIMARY KEY USING BTREE(`PACKAGE_ID`, `CREATE_TIME`);
2.查看数据库服务器性能,执行前后性能对比


添加索引后,自动化执行速度和成功率也有显著提升。
3 扩展分析
正常情况下,慢sql日志是存储在服务器上的,但是也可以通过mysql设置来通过数据库查看慢sql。
慢日志全称为慢查询日志(Slow Query Log),主要用来记录在 MySQL 中执行时间超过指定时间的 SQL 语句。通过慢查询日志,可以查找出哪些语句的执行效率低,以便进行优化。
默认情况下,MySQL 并没有开启慢日志,可以通过修改 slow_query_log 参数来打开慢日志。与慢日志相关的参数介绍如下:
•slow_query_log:是否启用慢查询日志,默认为0,可设置为0、1,1表示开启。
•slow_query_log_file:指定慢查询日志位置及名称,默认值为host_name-slow.log,可指定绝对路径。
•long_query_time:慢查询执行时间阈值,超过此时间会记录,默认为10,单位为s。
•log_output:慢查询日志输出目标,默认为file,即输出到文件。
•log_timestamps:主要是控制 error log、slow log、genera log 日志文件中的显示时区,默认使用UTC时区,建议改为 SYSTEM 系统时区。
•log_queries_not_using_indexes:是否记录所有未使用索引的查询语句,默认为off。
•min_examined_row_limit:对于查询扫描行数小于此参数的SQL,将不会记录到慢查询日志中,默认为0。
•log_slow_admin_statements:慢速管理语句是否写入慢日志中,管理语句包含 alter table、create index 等,默认为 off 即不写入。
可以先来自定义慢sql时长,也就是语句执行超过多长时间会被定义为慢sql;
show variables like 'long_query_time' //慢sql查询阈值设置
然后,开启是否记录所有未使用索引的查询语句开关log_queries_not_using_indexes,默认为off;
SHOW variables LIKE 'log_queries_not_using_indexes' //查询未开启索引的开关;
set global log_queries_not_using_indexes = on //开启索引监控开关;
上述开关开启之后,开始分析异常日志;
show variables like 'log_output' - log_output 默认值是FILE,是输出在服务器上的;
set global log_output = 'TABLE' - 设置为TABLE,可以直接从数据库查到;
通过数据库查询慢sql:
select *from mysql.slow_log - 慢日志查询结果;
从上图中可以很明显的看出具体的慢sql涉及的表,及查询时长,后面就可以针对具体的表进行针对性的优化了~
当然,在实际环境下,不建议开启 log_queries_not_using_indexes 参数,此参数打开后可能导致慢日志迅速增长。
所以,针对上述分析过程,各位操作完成后,可以再关闭慢日志输出到数据库,之后有分析需求再开启,这样就会有效减少对数据库的压力。
4 总结
综上,我们每个人不仅仅是测试环境的使用者,更是测试环境的建设者,每个人都需要有意识的把负责的服务测试环境稳定性提升上来,这样整体业务的测试环境稳定性才能有保障。
而且,对于测试环境管理和维护这条路,其实是随着解决的问题深入,需要有很深入的思考和解决问题能力,随之,对技术的要求也越来越高,当然,这也正是我们的价值所在。
以上,与君共勉~
测试环境治理之MYSQL索引优化篇的更多相关文章
- MySQL索引优化看这篇文章就够了!
阅读本文大概需要 5 分钟. 来源:cnblogs.com/songwenjie/p/9410009.html 本文主要讨论MySQL索引的部分知识.将会从MySQL索引基础.索引优化实战和数据库索引 ...
- 讲真,MySQL索引优化看这篇文章就够了
本文主要讨论MySQL索引的部分知识.将会从MySQL索引基础.索引优化实战和数据库索引背后的数据结构三部分相关内容,下面一一展开. 一.MySQL——索引基础 首先,我们将从索引基础开始介绍一下什么 ...
- Mysql 索引优化分析
MySQL索引优化分析 为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及explain输出字 ...
- mysql索引优化比普通查询速度快多少
mysql索引优化比普通查询速度快多少 一.总结 一句话总结:普通查询全表查询,速度较慢,索引优化的话拿空间换时间,一针见血,所以速度要快很多. 索引优化快很多 空间换时间 1.软件层面优化数据库查询 ...
- mySql索引优化分析
MySQL索引优化分析 为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及explain输出字 ...
- 知识点:Mysql 索引优化实战(3)
知识点:Mysql 索引原理完全手册(1) 知识点:Mysql 索引原理完全手册(2) 知识点:Mysql 索引优化实战(3) 知识点:Mysql 数据库索引优化实战(4) 索引原理知识回顾 索引的性 ...
- 阿里开源 KT Connnect,轻量级云原生测试环境治理平台来啦!
作者| 阿里云技术专家 郑云龙(砧木) 目前越来越多的开发者开始采纳 Kubernetes 管理基础设施环境,并通过 Kubernetes 完成日常的开发,测试以及生产发布活动,为了能够有效的帮助开发 ...
- 《MySQL性能优化篇》阅读笔记
建表的时候,不要用null赋默认值,如:字符串的设置'',数据类型的设为0,不要将null设为默认值. 在MySQL中没有 full [outer] join,用union代替 各种 JOIN SQL ...
- 深入浅出Mysql索引优化专题分享|面试怪圈
文章纲要 该文章结合18张手绘图例,21个SQL经典案例.近10000字,将Mysql索引优化经验予以总结,你可以根据纲要来决定是否继续阅读,完成这篇文章大概需要25-30分钟,相信你的坚持是不负时光 ...
- mysql索引优化
mysql 索引优化 >mysql一次查询只能使用一个索引.如果要对多个字段使用索引,建立复合索引. >越小的数据类型通常更好:越小的数据类型通常在磁盘.内存和CPU缓存中都需要更少的空间 ...
随机推荐
- 2html5
多媒体标签 <audio> <audio src='../audio/bxb.mp3' controls="controls" autoplay="au ...
- revit转tileset 3dmax转tileset cesium展示
使用revit软件导出fbx模型: 使用glTFExport导出gltf模型,导出的gltf模型具有属性.但是此处导出gltf模型,不是为了在cesium中加载该gltf模型,主要目的是获取组件属性信 ...
- 功能测试--APP专项
APP测试重点 APP测试与web测试的区别 APP测试常见问题 APP日志分析 APP压力稳定性测试
- Laravel安装第一步:Windows 10 上laravel下载与安装需要注意。
1.下载了laravel,查看composer.json文件,搞清楚它需要的PHP版本 2.不要用 composer install !!! 用 composer -vvv install 这样 ...
- 01-什么是ElasticSearch
1.什么是搜索? 百度:我们想要查找想要的一些信息比如在百度搜索一本书,一部电影这就是最常见的搜索 但是百度!=搜索 垂直搜索(站内搜索) 互联网的搜索:电商网站,新闻网站,招聘网站,等等 IT系统的 ...
- 【Golang】数据库使用
非结构化方式获取数据库结果 动态列获取结果 https://github.com/go-sql-driver/mysql/wiki/Examples#rawbytes
- 使用yarn启用项目,报错无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\yarn.ps1,因为在此系 统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。
这是由于新版win10 安装的时候会出现: 解决 搜索powershell,右键以管理员身份运行 2.打开之后,执行命令set-ExecutionPolicy RemoteSigned更改 Power ...
- 不使用setTimeout的延迟执行
function sleep(ms){ var time = new Date(); time.setTime(time.getTime() + ms); while(new Date().getTi ...
- 1.3 ODBC 部署监控数据库
一.安装ODBC 来自为知笔记(Wiz)
- mybaits-plus 部分注解说明
参考: https://blog.csdn.net/qq_45684867/article/details/123951309