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

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

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

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

问题描述

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

问题复现

我们在本地准备环境复现下,本地环境mysql使用的版本时8,首先准备一张表bus_pages,除了主键不创建其它索引,准备两个接口,一个修改,一个新增TQN28资讯网——每日最新资讯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));    }}

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

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

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

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

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

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

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

命令行查看(mysql版本8.0)

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

此命令用于列出当前正在使用中的表,也就是说那些被锁定或正在进行某些操作(如读写操作)的表。TQN28资讯网——每日最新资讯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条件包含索引字段,可以有效地提升数据库的性能和并发能力。TQN28资讯网——每日最新资讯28at.com

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

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

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

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

标签:
  • 热门焦点
  • 一年经验在二线城市面试后端的经验分享

    忠告这篇文章只适合2年内工作经验、甚至没有工作经验的朋友阅读。如果你是2年以上工作经验,请果断划走,对你没啥帮助~主人公这篇文章内容来自 「升职加薪」星球星友 的投稿,坐
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 讲故事上个月我写过一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,当时用的是 GDIView + WinDbg 把问题搞定,前者用来定位泄露资源,后者用来定位泄露代码,后面有朋友反
  • 一个注解实现接口幂等,这样才优雅!

    场景码猿慢病云管理系统中其实高并发的场景不是很多,没有必要每个接口都去考虑并发高的场景,比如添加住院患者的这个接口,具体的业务代码就不贴了,业务伪代码如下:图片上述代码有
  • 雅柏威士忌多款单品价格大跌,泥煤顶流也不香了?

    来源 | 烈酒商业观察编 | 肖海林今年以来,威士忌市场开始出现了降温迹象,越来越多不断暴涨的网红威士忌也开始悄然回归市场理性。近日,LVMH集团旗下苏格兰威士忌品牌雅柏(Ardbeg
  • 重估百度丨“晚熟”的百度云,能等到春天吗?

    &copy;自象限原创作者|程心排版|王喻可2016年7月13日,百度云计算战略发布会在北京举行,宣告着百度智能云的正式启程。彼时的会场座无虚席,甚至排队排到了门外,在场的所有人几乎都
  • 共享单车的故事讲到哪了?

    来源丨海克财经与共享充电宝相差不多,共享单车已很久没有被国内热点新闻关照到了。除了一再涨价和用户直呼用不起了。近日多家媒体再发报道称,成都、天津、郑州等地多个共享单
  • 梁柱接棒两年,腾讯音乐闯出新路子

    文丨田静 出品丨牛刀财经(niudaocaijing)7月5日,企鹅FM发布官方公告称由于业务调整,将于9月6日正式停止运营,这意味着腾讯音乐长音频业务走向消亡。腾讯在长音频领域还在摸索。为
  • 消费结构调整丨巨头低价博弈,拼多多还卷得动吗?

    来源:征探财经作者:陈香羽随着流量红利的退潮,电商的存量博弈越来越明显。曾经主攻中高端与品质的淘宝天猫、京东重拾&ldquo;低价&rdquo;口号。而过去与他们错位竞争的拼多多,靠
  • 微博大门常打开,迎接海外画师漂洋东渡

    作者:互联网那些事&ldquo;起猛了,我能看得懂日语了&rdquo;。&ldquo;为什么日本人说话我能听懂?&rdquo;&ldquo;中文不像中文,日语不像日语,但是我竟然看懂了&rdquo;&hellip;&hell
Top