<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
一方面 :在阿里雲控制檯雲資料庫PolarDB對應的叢集管理頁面上,在診斷與優化模組裡面的一鍵診斷對談管理中,發現某條update sql 執行時間非常久且非常頻繁;
另一方面:業務監控系統中開始不斷有業務執行時間發出告警資訊提示,且告警的業務資料不斷上升,部分操作影響客戶使用。
由於業務操作涉及到的業務流比較複雜,對純技術的分享來看,不是重點討論的話,為了更有利於理解問題發生的原因,使用類比的方式,把複雜的業務類比成如下描述: 有資料庫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='孫子表';
三張表之間的業務邏輯關係為,先生成老爺表,然後這個老爺取很多老婆(業務),會不斷的生娃,生一個娃就會生成一張老爸表,同時會更新老爺表的count=count+1,表示新增一個後代了,老爺的老婆(業務)在不斷的生娃的時候,之前的生的娃也會有老婆,他們的老婆也會生娃,對老爺來說,就是它有了孫子(產生新的業務資料),那有了孫子之後也需要更新老爺表的count=count+1,表示新增一個後代了,以此類推,子子孫孫無窮盡也(業務資料不斷生成) 如下圖所示:
祖傳程式碼的邏輯為,只要是t_father表和t_grandson有新增,就去更新t_grandfather。這個邏輯設計上問題不大,不過考慮到孫子表資料量很猛的時候,這裡就會出現一個非常嚴重的效能問題。以下是業務摘取的一部分虛擬碼
/** * 處理 father 的業務 */ 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 的業務 */ 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()); } }
當多個業務(執行緒)分別呼叫上面的方法時,都會對t_grandfather表的更新操作造成巨大的壓力,特別是更新同一個id的情況下,mysql server內部對鎖的競爭非常激烈。最後表現出來就如前文背景描述的一致。
1. 臨時處理方案:
一方面,在阿里雲控制檯,對sql進行限流,在正常阻塞的對談,強制kill掉,讓資料的執行緒不阻塞著,釋放資源,另外一方面,在把接收請求的服務減少節點數,目的是減少業務資料量進入;
2. 長久方案
一方面更改掉上面的業務邏輯,插入t_grandson表和t_father表時,不在去更新t_grandfather表的count欄位;另一方面,需要用到count統計需求時,全部切換成別的方式;
到此這篇關於一次Mysql update sql不當引起的生產故障的文章就介紹到這了,更多相關Mysql update sql生產故障內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45