日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

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

來源: 責編: 時間:2024-05-27 08:57:35 174觀看
導讀最近在灰度環境中遇到一個問題:某項業務在創建數據時耗時異常長,但同樣的代碼在預發環境中并未出現此問題。起初我們以為是調用第三方接口導致的性能問題,但通過日志分析發現第三方接口的響應時間正常。最終,我們發現工單

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

問題描述

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

問題復現

我們在本地準備環境復現下,本地環境mysql使用的版本時8,首先準備一張表bus_pages,除了主鍵不創建其它索引,準備兩個接口,一個修改,一個新增CLd28資訊網——每日最新資訊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));    }}

我們首先調用修改方法,然后在調用新增方法,可以看到新增的接口會一直等待修改的接口完成之后才會執行完成。CLd28資訊網——每日最新資訊28at.com

圖片圖片CLd28資訊網——每日最新資訊28at.com

然后我們給表bus_pages的mark__id字段創建索引CLd28資訊網——每日最新資訊28at.com

圖片圖片CLd28資訊網——每日最新資訊28at.com

然后在執行修改及新增接口,可以看到新增接口不會在等待修改接口執行完在去執行了CLd28資訊網——每日最新資訊28at.com

圖片圖片CLd28資訊網——每日最新資訊28at.com

注意: 并不是創建了索引就不會鎖表,當我們的索引失效時,也會鎖表CLd28資訊網——每日最新資訊28at.com

命令行查看(mysql版本8.0)

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

此命令用于列出當前正在使用中的表,也就是說那些被鎖定或正在進行某些操作(如讀寫操作)的表。CLd28資訊網——每日最新資訊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條件包含索引字段,可以有效地提升數據庫的性能和并發能力。CLd28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-90859-0.html避免鎖表:為Update語句中的Where條件添加索引字段

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Java Nio FileChannel堆內堆外數據讀寫全流程分析及使用

下一篇: Go語言:利用Govaluate構建規則配置引擎

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 马鞍山市| 本溪| 罗江县| 崇文区| 资兴市| 湖北省| 沙坪坝区| 博野县| 昌黎县| 武定县| 安陆市| 辽阳县| 萨迦县| 资溪县| 营口市| 南漳县| 通海县| 河东区| 望奎县| 嘉鱼县| 安龙县| 阿克苏市| 诸暨市| 周口市| 炉霍县| 旬邑县| 遂平县| 大冶市| 太仓市| 宿松县| 丰原市| 工布江达县| 延庆县| 武定县| 安徽省| 青海省| 桃江县| 万全县| 黄冈市| 克拉玛依市| 娄底市|