成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

避免鎖表:為Update語句中的Where條件添加索引字段

開發 前端
在編寫Update語句時,務必注意Where條件中涉及的字段是否有索引支持。避免全表鎖的關鍵在于優化查詢,利用索引提高查詢效率,減少系統性能的影響。通過合理地設計索引,并確保Update語句中的Where條件包含索引字段,可以有效地提升數據庫的性能和并發能力。

最近在灰度環境中遇到一個問題:某項業務在創建數據時耗時異常長,但同樣的代碼在預發環境中并未出現此問題。起初我們以為是調用第三方接口導致的性能問題,但通過日志分析發現第三方接口的響應時間正常。最終,我們發現工單表的數據入庫SQL一直處于等待狀態。深入分析后,問題的核心暴露出來:另一業務流程中對工單表執行更新(UPDATE)操作的SQL,其where子句中涉及的字段缺少必要的索引,導致其他業務在操作表中的數據時需要等待該更新完成。今天就和大家分享一下這個經驗。

問題描述

mysql 修改數據時,如果where條件后的字段未加索引或者未命中索引會導致鎖表。這種鎖表行為會阻塞其他事務對該表的訪問,顯著降低并發性能和系統響應速度。

問題復現

我們在本地準備環境復現下,本地環境mysql使用的版本時8,首先準備一張表bus_pages,除了主鍵不創建其它索引,準備兩個接口,一個修改,一個新增

@Service
@Slf4j
public 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));

    }


}

我們首先調用修改方法,然后在調用新增方法,可以看到新增的接口會一直等待修改的接口完成之后才會執行完成。

圖片圖片

然后我們給表bus_pages的mark__id字段創建索引

圖片圖片

然后在執行修改及新增接口,可以看到新增接口不會在等待修改接口執行完在去執行了

圖片圖片

注意: 并不是創建了索引就不會鎖表,當我們的索引失效時,也會鎖表

命令行查看(mysql版本8.0)

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

此命令用于列出當前正在使用中的表,也就是說那些被鎖定或正在進行某些操作(如讀寫操作)的表。

  • 查看正在等待鎖資源的查詢
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條件包含索引字段,可以有效地提升數據庫的性能和并發能力。

責任編輯:武曉燕 來源: 修己xj
相關推薦

2010-09-28 15:07:14

SQL語句

2010-09-06 09:11:24

SQLUPDATE語句

2022-12-18 16:56:07

索引MySQL

2020-11-05 09:33:37

SQL數據庫編程

2020-11-06 07:09:06

SQL注入編程

2022-11-05 08:37:00

MySQL數據索引

2021-09-16 06:44:07

數據庫SQL語句

2009-05-21 09:09:47

where查詢條件邏輯值

2024-10-08 09:35:23

2011-09-08 16:30:59

SQL Server查詢

2023-11-06 08:35:08

表鎖行鎖間隙鎖

2024-06-14 09:27:00

2023-10-25 08:21:15

悲觀鎖MySQL

2022-03-10 11:25:51

InnoDB優化

2010-09-16 15:56:15

SQL Server表

2024-07-05 10:19:59

2024-10-05 00:00:10

SQL語句指定連接條

2025-02-10 09:58:48

2010-09-03 15:47:40

SQL語句鎖定

2010-09-03 14:39:15

SQLSELECT語句
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 毛片av免费看 | 懂色一区二区三区免费观看 | 九九热视频这里只有精品 | 人人干人人爽 | 欧美日韩手机在线观看 | 亚洲国产成人久久综合一区,久久久国产99 | 亚洲综合色网站 | 伊人久久综合影院 | 国产精品免费观看 | 国产美女精品 | 日韩成人在线网址 | 狠狠操天天干 | 亚洲黄色一级 | 久久久久九九九女人毛片 | 国产精品69久久久久水密桃 | 久久久久国产一区二区三区 | 久久久天天 | 天天躁日日躁狠狠躁白人 | 曰批视频在线观看 | 欧美一区二不卡视频 | 精品国产精品国产偷麻豆 | 91久久国产综合久久 | 成人免费视频在线观看 | 国产欧美精品一区二区色综合朱莉 | 国产精品99久久久久久久vr | 久久新视频 | 日韩国产一区二区三区 | 免费黄色的视频 | 成人免费一级视频 | 国产精品成人在线 | 日本成人毛片 | 午夜在线 | 韩国久久精品 | 色播久久久| 日韩欧美大片在线观看 | 91免费视频观看 | 中文字幕乱码一区二区三区 | 免费一区二区三区在线视频 | 欧美在线一区二区三区 | 国产福利在线 | 成年网站在线观看 |