首页 > 数据库 >测试环境治理之MYSQL索引优化篇

测试环境治理之MYSQL索引优化篇

时间:2023-04-18 11:37:58浏览次数:36  
标签:log package waybill 查询 索引 MYSQL 日志 测试环境

作者:京东物流 李光新

1 治理背景

测试环境这个话题对于开发和测试同学一定不陌生,大家几乎每天都会接触。但是说到对测试环境的印象,却鲜有好评:

•环境不稳定,测试五分钟,排查两小时

•基础建设不全,导致验证不充分,遗漏缺陷

•多人共用,节点堵塞

这些问题在行业内其实屡见不鲜,针对测试环境的治理,不得不引起我们的重视。

首先我们要清晰的认知到,测试环境管理做的不好,不光有严重的质量风险,还会非常影响迭代效率,所以这件事情很重要。那在解决它之前,我们首先要去想想,对于测试环境我们到底有哪些诉求?

很明显,测试环境的定位就是满足产研测的测试需求,保障产品迭代质量。所以从使用类型上,一般要支撑集成测试,系统测试,甚至故障测试等。

而这些环境背后,其实都伴随着非功能性要求 ,重点体现在:

1.从使用者角度

•想用就有,不要等待

•要低维护,高稳定

1.从企业角度

•低成本,高效率

简单总结一下,理想的测试环境应该是:自由连接、随时可用、互访可控。

那么现实中的测试环境又是怎样的呢?所谓“理想很丰满,现实很骨感”,对于一线测试工程师可能会发现,真实的测试环境并非这么理想。

测试同学算是测试环境的主要使用者,对测试环境的管理理应负有直接责任。不过现实中,经常看到的是,测试同学因本身测试任务较多,且测试环境管理也要求具备一定的系统运维能力,导致相对而言,测试同学要想做好测试环境管理,也不容易~

下面就主要给大家分享一次实际工作中的Mysql性能优化实践,与大家共勉~

问题点:物流中台运单waybill.etms应用,由于包裹表未使用索引,导致的cpu飚高问题

2 分析过程

1.不管是在日常自动化测试还是功能测试过程中,经常会遇到数据库数据落库比较慢的场景,不仅影响功能测试进度,还会影响自动化的执行时长和成功率,在此背景下,展开如下排查工作~

2.查询两个异常运单,发现数据落库在十分钟以上,展开分析,

测试环境治理之MYSQL索引优化篇_慢查询

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.直接搜异常日志关键字,“接货平台下发处理异常”,确认推测正确;

测试环境治理之MYSQL索引优化篇_测试环境_02

测试环境治理之MYSQL索引优化篇_数据库_03

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.然后排查数据库索引:

测试环境治理之MYSQL索引优化篇_测试环境_04

测试环境治理之MYSQL索引优化篇_数据库_05

运单数据库是分库分表的,上述包裹表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.查看数据库服务器性能,执行前后性能对比

测试环境治理之MYSQL索引优化篇_sql_06

测试环境治理之MYSQL索引优化篇_sql_07

测试环境治理之MYSQL索引优化篇_sql_08

添加索引后,自动化执行速度和成功率也有显著提升。

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 总结

综上,我们每个人不仅仅是测试环境的使用者,更是测试环境的建设者,每个人都需要有意识的把负责的服务测试环境稳定性提升上来,这样整体业务的测试环境稳定性才能有保障。

而且,对于测试环境管理和维护这条路,其实是随着解决的问题深入,需要有很深入的思考和解决问题能力,随之,对技术的要求也越来越高,当然,这也正是我们的价值所在。

以上,与君共勉~

标签:log,package,waybill,查询,索引,MYSQL,日志,测试环境
From: https://blog.51cto.com/u_15714439/6202733

相关文章

  • MySQL导入导出 —— mysqldump 简介及常见用法
    一、导出导出用户需要有导出对象的权限,例如导出表要有select权限、导出视图要有showview权限、导出触发器要有trigger权限、需要锁表时要有locktables权限等。如果dump文件中包含了GTID信息,则无法导入到未启用GTID的数据库(低于5.6.9版本的数据库不支持GTID,因此也无法导入到这些......
  • oracle、达梦数据库、MySQL数据创建表与字段注释
    /**1.oracle注释*//*表本身注释*/commentontable表名is'注释信息';/*字段注释*/commentoncolumn表名.字段名is'注释信息';/*实例如下:*/commentontableUSERis'用户表';commentoncolumnUSER.IDis'主键ID';/**2.MySQL注释*//*表本身注释*/altertable表名co......
  • 测试环境治理之MYSQL索引优化篇
    作者:京东物流 李光新1治理背景测试环境这个话题对于开发和测试同学一定不陌生,大家几乎每天都会接触。但是说到对测试环境的印象,却鲜有好评:•环境不稳定,测试五分钟,排查两小时•基础建设不全,导致验证不充分,遗漏缺陷•多人共用,节点堵塞这些问题在行业内其实屡见不鲜,针对测试......
  • 应用连MySQL 报错ERROR 1129 Host is blocked because of many connection errors
    开发反馈应用连MySQL报错 createconnectionSQLException,url:连接串,errorCode1129。搜索1129报错,报错内容为:Hostisblockedbecauseofmanyconnectionerrors一、报错原因同一个ip在短时间内产生太多中断的数据库连接(超过mysql数据库max_connection_errors设置),导......
  • Windows系统下,HHDBCS辅助Mysql安装
    通常来说,安装好Mysql后,使用HHDBCS和本机IP,就可以直接连入数据库。但有时候在安装成功的情况下,却连接不上Mysql。此时可以点击测试,会弹出提示框:由提示可知,被Mysql拒绝访问了。我们可以通过CMD来解决这个问题。使用管理员模式进入CMD;在登入mysql后,更改“mysql”数据库里的“......
  • MySQL_05存储过程
    存储过程存储过程有哪些优点:1、存储过程是一个预编译的sql语句优点:(1):存储过程预编译过得,执行效率高(2):存储过程的代码直接放在数据库中,通过存储过程的名称直接调用(3):安全性表较高,执行存储需要一定权限用户(4):存储过程可以重复使用,可减少开发人员的工作量......
  • MySQL高可用之MHA-02
    续目录配置vip一、keepalived方式二、通过脚本实现VIP切换总结@目录配置vip一、keepalived方式二、通过脚本实现VIP切换总结配置vipvip配置可以采用两种方式,一种通过keepalived的方式管理虚拟ip的浮动;另外一种通过脚本方式启动虚拟ip的方式(即不需要keepalived或者heartbeat类似......
  • MySQL中间件mycat-01
    @目录mycat基础概念Mycat安装部署mycat基础概念1、什么是MyCat一个彻底开源的,面向企业应用开发的大数据库集群支持事务、ACID、可以替代MySQL的加强版数据库一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群一个融合内存缓存技术、NoSQL技术、HDFS大数据的新......
  • MySQL高可用-双主(keepalived)
    生产环境中一台mysql主机存在单点故障,所以我们要确保mysql的高可用性,即两台MySQL服务器如果其中有一台MySQL服务器挂掉后,另外一台能立马接替其进行工作。MySQL的高可用方案一般有如下几种:keepalived+双主,MHA,PXC,MMM,Heartbeat+DRBD等,比较常用的是keepalived+双主,MHA和PXC。本节主......
  • MySQL高可用之PXC
    1.PXC简介参考Percona官方https://www.percona.com/software/mysql-database/percona-xtradb-clusterPXC(PerconaXtraDBCluster)是一个开源的MySQL高可用解决方案。它将PerconaServer和XtraBackup与Galera库集成,以实现同步多主复制。基于Galera的高可用方案主要有MariaDBGal......