最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一次Mysql?update?sql不當引起的生產故障記錄

 更新時間:2022年04月01日 11:35:56   作者:geoCode  
這篇文章主要給大家介紹了關于一次Mysql?update?sql不當引起的生產故障的相關資料,由于update涉及到數據的修改,所以很容易推斷,update語句比select語句會更復雜一些,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下

故障表現

  • 一方面 :在阿里云控制臺云數據庫PolarDB對應的集群管理頁面上,在診斷與優(yōu)化模塊里面的一鍵診斷會話管理中,發(fā)現某條update sql 執(zhí)行時間非常久且非常頻繁;

  • 另一方面:業(yè)務監(jiān)控系統(tǒng)中開始不斷有業(yè)務執(zhí)行時間發(fā)出告警信息提示,且告警的業(yè)務數據不斷上升,部分操作影響客戶使用。

業(yè)務背景

由于業(yè)務操作涉及到的業(yè)務流比較復雜,對純技術的分享來看,不是重點討論的話,為了更有利于理解問題發(fā)生的原因,使用類比的方式,把復雜的業(yè)務類比成如下描述: 有數據庫3張表,第一張表t_grandfather (爺表),第二張表為t_father(父表),第三張表t_grandson(子孫表),DDL如下:

CREATE TABLE `t_grandfather ` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `count` int(11) NOT NULL DEFAULT 0 COMMENT '子孫后代數量',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='老爺表';

CREATE TABLE `t_father ` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `grandfather_id` int(11) NOT NULL COMMENT '老爺表id',
  PRIMARY KEY (`id`),
  KEY `idx_grandfather_id` (`grandfather_id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='老爸表';

CREATE TABLE `t_grandson` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `grandfather_id` int(11) NOT NULL COMMENT '老爺表id',
  PRIMARY KEY (`id`),
  KEY `idx_grandfather_id` (`grandfather_id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='孫子表';

三張表之間的業(yè)務邏輯關系為,先生成老爺表,然后這個老爺取很多老婆(業(yè)務),會不斷的生娃,生一個娃就會生成一張老爸表,同時會更新老爺表的count=count+1,表示新增一個后代了,老爺的老婆(業(yè)務)在不斷的生娃的時候,之前的生的娃也會有老婆,他們的老婆也會生娃,對老爺來說,就是它有了孫子(產生新的業(yè)務數據),那有了孫子之后也需要更新老爺表的count=count+1,表示新增一個后代了,以此類推,子子孫孫無窮盡也(業(yè)務數據不斷生成) 如下圖所示:

祖?zhèn)鞔a的邏輯為,只要是t_father表和t_grandson有新增,就去更新t_grandfather。這個邏輯設計上問題不大,不過考慮到孫子表數據量很猛的時候,這里就會出現一個非常嚴重的性能問題。以下是業(yè)務摘取的一部分偽代碼

 /**
 * 處理 father 的業(yè)務
 */
 public void doFatherBusiness  (){
     //do fatherBusiness baba .... 此處省
     // 插入 t_father 表
    if (fatherMapper.inster(father)){
         //update t_grandfather set count=count+1 where id= #{grandfatherId}
         grandfatherMapper.updateCount(father.getGrandfatherId  ())  ;
     }
}


 /**
 * 處理 grandson 的業(yè)務
 */
 public void doGrandsonBusiness  (){
     //do grandson baba .... 此處省略
     // 插入 t_grandson 表
     if(grandsonMapper.inster(grandson)){
          //update t_grandfather set count=count+1 where id= #{grandfatherId}
          grandfatherMapper.updateCount(grandson.getGrandfatherId());
     }
}  

當多個業(yè)務(線程)分別調用上面的方法時,都會對t_grandfather表的更新操作造成巨大的壓力,特別是更新同一個id的情況下,mysql server內部對鎖的競爭非常激烈。最后表現出來就如前文背景描述的一致。

解決方案

1. 臨時處理方案:

一方面,在阿里云控制臺,對sql進行限流,在正常阻塞的會話,強制kill掉,讓數據的線程不阻塞著,釋放資源,另外一方面,在把接收請求的服務減少節(jié)點數,目的是減少業(yè)務數據量進入;

2. 長久方案

一方面更改掉上面的業(yè)務邏輯,插入t_grandson表和t_father表時,不在去更新t_grandfather表的count字段;另一方面,需要用到count統(tǒng)計需求時,全部切換成別的方式;

總結

到此這篇關于一次Mysql update sql不當引起的生產故障的文章就介紹到這了,更多相關Mysql update sql生產故障內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 讓MySQL中某個表的操作不生成binlog日志的問題解決

    讓MySQL中某個表的操作不生成binlog日志的問題解決

    文章介紹了四種方法讓MySQL中某個表的操作不生成binlog日志:會話級臨時關閉binlog、通過復制過濾規(guī)則、調整binlog格式和全局禁用binlog,每種方法都有其適用場景和局限性,建議優(yōu)先使用會話級臨時關閉方法,并根據具體需求選擇合適的方案,感興趣的朋友跟隨小編一起看看吧
    2025-03-03
  • SQL慢查詢優(yōu)化方案詳解

    SQL慢查詢優(yōu)化方案詳解

    這篇文章主要介紹了SQL慢查詢優(yōu)化方案詳解,如果你的項目中出現了一些查詢超時情況,很可能是項目中有了一些慢查詢的情況產生,下面就慢查詢的排查和解決方案進行一番分析,需要的朋友可以參考下
    2023-07-07
  • Mysql查詢很慢卡在sending data的原因及解決思路講解

    Mysql查詢很慢卡在sending data的原因及解決思路講解

    今天小編就為大家分享一篇關于Mysql查詢很慢卡在sending data的原因及解決思路講解,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • MySQL的Grant命令詳解

    MySQL的Grant命令詳解

    mysql中可以通過Grant命令為數據庫賦予用戶權限,這里簡單介紹下Grant的使用方法,需要的朋友可以參考下
    2013-10-10
  • 生產環(huán)境的MySQL事務隔離級別方式

    生產環(huán)境的MySQL事務隔離級別方式

    本文探討了MySQL數據庫在RR(可重復讀)和RC(讀已提交)隔離級別下的鎖機制,在RR級別下,UPDATE語句會鎖定所有符合條件的行,包括不符合條件的行,以防止幻讀,而在RC級別下,UPDATE語句僅鎖定符合條件的行,通過半一致性讀優(yōu)化,可以進一步提高并發(fā)度
    2025-02-02
  • MySQL DQL語句的具體使用

    MySQL DQL語句的具體使用

    本文主要介紹了MySQL DQL語句的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • 數據庫索引的知識點整理小結,你所需要了解的都在這兒了

    數據庫索引的知識點整理小結,你所需要了解的都在這兒了

    這篇文章主要介紹了數據庫索引的知識點整理小結,你所需要了解的都在這兒了,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • MySQL的查詢緩存機制基本學習教程

    MySQL的查詢緩存機制基本學習教程

    這篇文章主要介紹了MySQL的查詢緩存機制基本學習教程,默認針對InnoDB存儲引擎下來將,需要的朋友可以參考下
    2015-11-11
  • MySQL數據庫的實時備份知識點詳解

    MySQL數據庫的實時備份知識點詳解

    本篇文章給大家分享了關于MySQL數據庫的實時備份知識點內容,有需要的朋友們可以參考下。
    2018-08-08
  • mysql 5.7.9 免安裝版配置方法圖文教程

    mysql 5.7.9 免安裝版配置方法圖文教程

    這篇文章主要為大家分享了mysql 5.7.9 免安裝版配置方法圖文教程,感興趣的小伙伴們可以參考一下
    2016-08-08

最新評論

依安县| 大安市| 温州市| 蓬安县| 浏阳市| 杭州市| 邮箱| 南丰县| 清涧县| 翁牛特旗| 赤城县| 惠安县| 嘉定区| 高阳县| 都兰县| 宜良县| 香格里拉县| 普宁市| 绵阳市| 定南县| 民和| 舞阳县| 惠州市| 肃宁县| 兴城市| 久治县| 通渭县| 富平县| 武功县| 溆浦县| 锦州市| 鞍山市| 呼伦贝尔市| 大厂| 怀集县| 方城县| 东丽区| 罗山县| 安溪县| 巍山| 弋阳县|