当前位置:首页 > 科技  > 软件

避免锁表:为Update语句中的Where条件添加索引字段

来源: 责编: 时间:2024-05-27 08:57:35 263观看
导读最近在灰度环境中遇到一个问题:某项业务在创建数据时耗时异常长,但同样的代码在预发环境中并未出现此问题。起初我们以为是调用第三方接口导致的性能问题,但通过日志分析发现第三方接口的响应时间正常。最终,我们发现工单

最近在灰度环境中遇到一个问题:某项业务在创建数据时耗时异常长,但同样的代码在预发环境中并未出现此问题。起初我们以为是调用第三方接口导致的性能问题,但通过日志分析发现第三方接口的响应时间正常。最终,我们发现工单表的数据入库SQL一直处于等待状态。深入分析后,问题的核心暴露出来:另一业务流程中对工单表执行更新(UPDATE)操作的SQL,其where子句中涉及的字段缺少必要的索引,导致其他业务在操作表中的数据时需要等待该更新完成。今天就和大家分享一下这个经验。Z3A28资讯网——每日最新资讯28at.com

问题描述

mysql 修改数据时,如果where条件后的字段未加索引或者未命中索引会导致锁表。这种锁表行为会阻塞其他事务对该表的访问,显著降低并发性能和系统响应速度。Z3A28资讯网——每日最新资讯28at.com

问题复现

我们在本地准备环境复现下,本地环境mysql使用的版本时8,首先准备一张表bus_pages,除了主键不创建其它索引,准备两个接口,一个修改,一个新增Z3A28资讯网——每日最新资讯28at.com

@Service@Slf4jpublic class BusTestServiceImpl implements BusTestService {    @Resource    private BusPagesService busPagesService;    @Override    @Transactional(rollbackFor = Exception.class)    public void updateInfo() {        StopWatch sw = new StopWatch();        sw.start();        log.info("修改方法执行开始");        LambdaUpdateWrapper<BusPagesEntity> updateWrapper = new LambdaUpdateWrapper();        updateWrapper.eq(BusPagesEntity::getMarkId,18);        updateWrapper.set(BusPagesEntity::getPage,LocalDateTime.now().toString());        busPagesService.update(updateWrapper);        try {            Thread.sleep(40*1000);        } catch (InterruptedException e) {            throw new RuntimeException(e);        }        sw.stop();        log.info("修改方法执行结束,耗时{}s",sw.getTime(TimeUnit.SECONDS));    }    @Override    public void saveInfo() {        StopWatch sw = new StopWatch();        sw.start();        log.info("新增方法执行开始");        BusPagesEntity busPagesEntity = new BusPagesEntity();        busPagesEntity.setPage(LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_TIME));        busPagesService.save(busPagesEntity);        sw.stop();        log.info("新增方法执行结束,耗时{}s",sw.getTime(TimeUnit.SECONDS));    }}

我们首先调用修改方法,然后在调用新增方法,可以看到新增的接口会一直等待修改的接口完成之后才会执行完成。Z3A28资讯网——每日最新资讯28at.com

图片图片Z3A28资讯网——每日最新资讯28at.com

然后我们给表bus_pages的mark__id字段创建索引Z3A28资讯网——每日最新资讯28at.com

图片图片Z3A28资讯网——每日最新资讯28at.com

然后在执行修改及新增接口,可以看到新增接口不会在等待修改接口执行完在去执行了Z3A28资讯网——每日最新资讯28at.com

图片图片Z3A28资讯网——每日最新资讯28at.com

注意: 并不是创建了索引就不会锁表,当我们的索引失效时,也会锁表Z3A28资讯网——每日最新资讯28at.com

命令行查看(mysql版本8.0)

  • 查看被锁定的表
show OPEN TABLES where In_use > 0;

此命令用于列出当前正在使用中的表,也就是说那些被锁定或正在进行某些操作(如读写操作)的表。Z3A28资讯网——每日最新资讯28at.com

  • 查看正在等待锁资源的查询
select * from performance_schema.data_lock_waits;
select * from sys.innodb_lock_waits;
  • 查看锁定数据
select * from performance_schema.data_locks;
  • 查看正在运行中的事务或命令的详情
select * from information_schema.innodb_trx;

总结

在编写Update语句时,务必注意Where条件中涉及的字段是否有索引支持。避免全表锁的关键在于优化查询,利用索引提高查询效率,减少系统性能的影响。通过合理地设计索引,并确保Update语句中的Where条件包含索引字段,可以有效地提升数据库的性能和并发能力。Z3A28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-90859-0.html避免锁表:为Update语句中的Where条件添加索引字段

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Java Nio FileChannel堆内堆外数据读写全流程分析及使用

下一篇: Go语言:利用Govaluate构建规则配置引擎

标签:
  • 热门焦点
  • MIX Fold3包装盒泄露 新机本月登场

    小米的全新折叠屏旗舰MIX Fold3将于本月发布,近日该机的真机包装盒在网上泄露。从图上来看,新的MIX Fold3包装盒在外观设计方面延续了之前的方案,变化不大,这也是目前小米旗舰
  • 一加Ace2 Pro真机揭晓 钛空灰配色质感拉满

    终于,在经过了几波预热之后,一加Ace2 Pro的外观真机图在网上出现了。还是博主数码闲聊站曝光的,这次的外观设计还是延续了一加11的方案,只是细节上有了调整,例如新加入了钛空灰
  • K60至尊版狂暴引擎2.0加持:超177万跑分斩获性能第一

    Redmi的后性能时代战略发布会今天下午如期举办,在本次发布会上,Redmi公布了多项关于和联发科的深度合作,以及新机K60 Ultra在软件和硬件方面的特性,例如:“K60 至尊版,双芯旗舰
  • Mate60手机壳曝光 致敬自己的经典设计

    8月3日消息,今天下午博主数码闲聊站带来了华为Mate60的第三方手机壳图,可以让我们在真机发布之前看看这款华为全新旗舰的大致轮廓。从曝光的图片看,Mate 60背后摄像头面积依然
  • 三言两语说透设计模式的艺术-单例模式

    写在前面单例模式是一种常用的软件设计模式,它所创建的对象只有一个实例,且该实例易于被外界访问。单例对象由于只有一个实例,所以它可以方便地被系统中的其他对象共享,从而减少
  • JavaScript学习 -AES加密算法

    引言在当今数字化时代,前端应用程序扮演着重要角色,用户的敏感数据经常在前端进行加密和解密操作。然而,这样的操作在网络传输和存储中可能会受到恶意攻击的威胁。为了确保数据
  • 为什么你不应该使用Div作为可点击元素

    按钮是为任何网络应用程序提供交互性的最常见方式。但我们经常倾向于使用其他HTML元素,如 div span 等作为 clickable 元素。但通过这样做,我们错过了许多内置浏览器的功能。
  • 国行版三星Galaxy Z Fold5/Z Flip5发布 售价7499元起

    2023年8月3日,三星电子举行Galaxy新品中国发布会,正式在国内推出了新一代折叠屏智能手机三星Galaxy Z Fold5与Galaxy Z Flip5,以及三星Galaxy Tab S9
  • 到手价3099元起!iQOO Neo8 Pro今日首销:安卓性能最强旗舰

    5月23日,iQOO如期举行了新品发布会,全新的iQOO Neo8系列也正式与大家见面,包含iQOO Neo8和iQOO Neo8 Pro两个版本,其中标准版搭载高通骁龙8+,而Pro版更
Top