欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一次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 max_allowed_packet的坑

    MySQL max_allowed_packet的坑

    max_allowed_packet是 MySQL 中的一個設定參數,用于設定所接受的包的大小,根據情形不同,其缺省值可能是 1M 或者 4M,本文主要介紹了MySQL max_allowed_packet的坑,感興趣的可以了解一下
    2024-01-01
  • Mysql優(yōu)化之Zabbix分區(qū)優(yōu)化

    Mysql優(yōu)化之Zabbix分區(qū)優(yōu)化

    這篇文章主要介紹了Mysql優(yōu)化中Zabbix分區(qū)優(yōu)化的詳細方法和優(yōu)缺點分析,一起學習下。
    2017-11-11
  • Mysql中STR_TO_DATE函數使用(字符串轉為日期/時間值)

    Mysql中STR_TO_DATE函數使用(字符串轉為日期/時間值)

    這篇文章主要給大家介紹了關于Mysql中STR_TO_DATE函數使用的相關資料,STR_TO_DATE函數的主要功能是字符串轉為日期/時間值,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • Windows10下mysql 8.0.19 winx64安裝教程及修改初始密碼

    Windows10下mysql 8.0.19 winx64安裝教程及修改初始密碼

    這篇文章主要為大家詳細介紹了Windows10下mysql 8.0.19 winx64安裝教程及修改初始密碼,文中安裝步驟介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • MySQL各個特殊時間段的查詢方法

    MySQL各個特殊時間段的查詢方法

    在MySQL數據庫中,經常需要查詢某個時間段內的數據,所以本文給大家介紹了MySQL各個特殊時間段的查詢方法,并提供相應的源代碼示例,具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-01-01
  • ubuntu安裝mysql數據庫方法

    ubuntu安裝mysql數據庫方法

    ubuntu基于linux的免費開源桌面PC操作系統(tǒng),十分契合英特爾的超極本定位,支持x86、64位和ppc架構。這篇文章給大家介紹ubuntu安裝mysql數據庫方法,非常不錯,需要的朋友參考下吧
    2019-08-08
  • mysql 5.7.21 winx64綠色版安裝配置方法圖文教程

    mysql 5.7.21 winx64綠色版安裝配置方法圖文教程

    這篇文章主要為大家詳細介紹了mysql 5.7.21 winx64綠色版安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • Mysql數據庫手動及定時備份步驟

    Mysql數據庫手動及定時備份步驟

    最近剛好用到了數據庫備份,想著還有個別實習或者剛工作的小伙伴一個drop不小心刪表、刪庫,心內慌得一批不知道該怎么辦,就打算跑路了,學會這個小技巧就不用跑路了
    2021-11-11
  • MySQL自動為查詢數據結果加序號

    MySQL自動為查詢數據結果加序號

    這篇文章主要給大家介紹了關于MYSQL如何自動為查詢數據的結果編上序號的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用mysql具有一定的參考學習價值,需要的朋友們下面隨著小編來一起看看吧
    2022-12-12
  • MySql 5.7.17免安裝配置教程詳解

    MySql 5.7.17免安裝配置教程詳解

    這篇文章給大家詳細介紹了MySql 5.7.17免安裝配置教程,首先大家需要先下載mysql 5.7.17 的安裝包,然后解壓,具體配置過程大家通過本文一起學習吧
    2017-03-03

最新評論