<del id="nnjnj"></del><track id="nnjnj"></track>

<p id="nnjnj"></p>

<address id="nnjnj"></address>

    <pre id="nnjnj"><pre id="nnjnj"></pre></pre>

      <noframes id="nnjnj"><ruby id="nnjnj"><ruby id="nnjnj"></ruby></ruby>

      • 自動秒收錄
      • 軟件:1973
      • 資訊:57811|
      • 收錄網站:279872|

      IT精英團

      MYSQL VS POLARDB唯一索引死鎖及應用設計

      MYSQL VS POLARDB唯一索引死鎖及應用設計

      瀏覽次數:
      評論次數:
      編輯: 澤洋
      信息來源: ITPUB
      更新日期: 2022-04-27 20:57:15
      摘要

      #issue68021MySQLuniquecheck問題-知乎(zhihu.com)事情的開始是這樣的,最近和阿里云密切聯系,也成為他們的大客戶,(我們當然是大客戶,BIGBIG

      • 正文開始
      • 相關閱讀
      • 推薦作品

      #問題68021 MySQL唯一檢查問題-知乎(zhihu.com)

      這是事情的開始。最近我和阿里云接觸比較密切,成為他們的大客戶(當然我們是大客戶BIG BIG BIG potato),也就是說我和他們的核心研發有密切的接觸;d同學。這段文字是他們的高層人物寫的關于MYSQL的唯一索引的文字,感謝他推給我。

      實際上,在DBA行業中,關于唯一索引的爭論一直不斷,但DBA對開發本身并不信服。我們只能說,如果你這樣做,你的表現會受到影響。當然,這和牛屎沒什么區別。

      我們截取陳老師文中關于偽代碼的部分。

      在二級索引中找到要插入值的B樹頁面

      斷言B樹頁面被鎖存

      equal-range=二級索引中與您的值沖突的記錄范圍

      如果(等于范圍不為空){

      釋放B樹上的閂鎖,并開始新的微型事務

      對于相等范圍內的每條記錄

      鎖定它之前的間隙和記錄本身(這就是LOCK_S所做的)

      最后一次后也鎖定間隙(等范圍)

      另外(在錯誤#32617942被修復之前),在最后一個(相等范圍)之后鎖定記錄

      一旦你完成了以上所有操作,再次找到B樹頁面,并再次鎖定它

      }

      將記錄插入頁面,并釋放B樹頁面上的閂鎖。

      讓我們開門見山,唯一的索引被插入。

      1索引是有序的。

      唯一索引是唯一的。

      雖然我們用的隔離級別是RC,但是同性戀鎖不會出現在MYSQL或者POLARDB里面,但是,但是,但是

      你是唯一的索引。

      我們需要確認的是

      1當插入唯一索引時,它將確定當前索引中是否存在相同的值。

      2插入時,避免同時插入其他相同的值。

      3插入時也要判斷順序,插入時也要考慮周圍值的變化。

      基于這些考慮,鎖是必要的。

      我們來看看這段偽代碼。

      在二級索引中找到要插入值的B樹頁面

      斷言B樹頁面被鎖存

      第一步是找到要插入數據的索引頁,并鎖定頁鎖。

      equal-range=二級索引中與您的值沖突的記錄范圍

      如果(等于范圍不為空){

      釋放B樹上的閂鎖,并開始新的微型事務

      對于相等范圍內的每條記錄

      在它之前鎖定缺口,記錄本身

      f (this is what LOCK_S does)
      also lock the gap after the last(equal-range)
      also (before Bug #32617942 was fixed) lock the record after last(equal-range)
      once you are done with all of the above, find the B-tree page again and latch it again
      }

      第二部是一個具有原子性的操作,

      1  獲取與你插入值有沖突的范圍,(尤其對那些多個鍵值是唯一索引的情況)

            2  如果你插入的鍵值的沖突范圍并不為空

                 3  將撤銷原有的栓鎖,將鎖的粒度變小

                     4  開始針對可能產生沖突的鍵值進行check  (期間產生間隙鎖)
      2  如果沒有沖突,數據插入到頁面

      在整個的操作過程中,是需要對插入的整體過程加GAP 鎖,保證在判斷后你插入數據前,不會有其他的數據插入到這個位置。

      之所以是說后續,這里考慮的問題是多鍵值的唯一索引與單鍵值的索引,為什么要考慮這個問題,主要還是目前使用的  next-key lock 在位置索引中可能產生的范圍的大小問題。

      舉例:

      在表設計時,我們可以對多列產生唯一索引,而根據上文中的描述,唯一的鍵值要插入到索引的情況下,是需要針對一段范圍的數據進行鎖定的,那么你的值越多,產生的范圍會越大,導致出現死鎖的概率就越大。

      上文中從源代碼的方面進行了闡述,如何對數據庫的源代碼進行改造,但使用者怎么辦,如何去最大化的規避問題。

      我們需要確認幾點

      1 數據插入索引是有序的

      2 數據插入到唯一索引時盡量少進行上面范圍的GAP LOCK

      這里就基于范圍的問題進行討論,如何能在程序設計的基礎上最大化的減小產生死鎖的幾率和范圍。

      如果有多個鍵值要進行唯一索引的處理時,需要通過HASH 算法(根據算法盡量避免由于HASH 算法導致的雖然值不同,但HASH 后值相同的可能性),通過將多個字段通過算法轉換為 一個HASH 值,并且對這個HASH值的字段建立唯一索引。

        

      這樣的好處顯而易見

      1  降低上文中提到在MYSQL 或POLARDB 中唯一索引出現死鎖的可能性

      2  降低一個表上出現較大唯一索引的情況(一個表中包含索引的整體字節數是有限制的)

      3  對應用友好和靈活,例如我今天是3個字段,明天可能是四個字段,那么實際上,產生這樣的情況下,表的索引不必改動,改動的是應用程序中關于插入HASH 字段的算法中包含的字段的數量即可。否則你又會建立一個新的唯一索引。

      其實數據庫本身作為三大系統之一的系統,包容性應該是很高的,但基于數據庫的對于數據的嚴謹性和邏輯性的問題,要求很高,導致使用數據庫的過程中,需要對數據庫本身的原理進行理解,盡量避免一些數據庫本身無法在短時間滿足的  性能 ---  功能  之間的矛盾,所以在設計應用程序時也應該有的放矢的進行有效設計。

      標簽:索引 死鎖 鍵值
      卡夫卡3.0新功能全暴露 好香??!
      ? 上一篇 2022-04-27
      在Linux中檢查磁盤空間的12個有用的df命令
      下一篇 ? 2022-04-27
      • 如何在Ubuntu中保留文件系統并備份當前開發板鏡像
        0閱讀 0條評論 個贊
        在Ubuntu保留文件系統或者說備份當前開發板鏡像的需求在不斷增加。比如Ubuntu文件系統需要安裝庫文件的話直接使用apt-get工具就可以下載,但由于需要下載的核心板較多,比較費時間,這時需要將安……
      • 國產核心板全志T507助力消防系統升級
        0閱讀 0條評論 個贊
        9月16日下午,位于湖南長沙市區內的中國電信大樓發生火災,建筑高度218米,現場濃煙滾滾,數十層樓體燃燒劇烈。消防救援人員趕到現場后很快將火勢控制住,目前大樓火勢已被撲滅,所幸未發現人員傷亡。湖南電信……
      • 教大家如何處理Spring Boot易流中的用戶和群體!
        0閱讀 0條評論 個贊
        1.準備工作2.用戶操作2.1添加用戶2.2修改用戶2.3刪除用戶2.4查詢用戶3.組操作3.1添加組3.2修改組3.3刪除組3.4查詢組4.查看表詳情雖然說我們在實際開發中,……
      • 從PG15開始WAL壓縮優化
        0閱讀 0條評論 個贊
        PG15傳聞中的超級令人激動的功能大多數跳票了,年初我也寫過一個關于PG15新功能跳票的文章。PG15BETA已經發出幾個月了,似乎PG15里令人激動人心的功能不多,不過從長長的新功能列表里,……
      • 深入了解美團葉子發射器開源方案
        0閱讀 0條評論 個贊
        大家好,我是樹哥。之前我們有聊過「如何設計一個分布式ID發號器」,其中有講過4種解決方案,分別是:UUID類雪花算法數據庫自增主鍵Redis原子自增美團以第2、3種解決方案為基礎,開發出……
      發表評論 共有條評論
      用戶名: 密碼:
      驗證碼: 匿名發表
      • 基于Flyway的數據庫版本控制實踐
        0閱讀 0條評論 個贊
        背景大家平時在開發過程中,會用Git來進行我們的代碼管理。如Git這些,使用這些版本控制系統能輕松的幫我們解決不同開發人員之間的代碼沖突處理版本回退實現軟件代碼的CI/CD等那大家考慮過么,針對數據庫……
      • 基于位置變化的市縣彈出引導切換
        31閱讀 0條評論 個贊
        目錄1.背景2.模型方案產出3.總結01背景58App業務中有城市和縣域兩個首頁,兩者中間有一個過渡選擇頁,用戶通過點擊該頁面下的條目內容可以切換到對應條目的首頁;比如:點擊“北京”會跳轉到北京(市)……
      • 自動化測試選擇Python還是Java?
        0閱讀 0條評論 個贊
        你好,我是測試蔡坨坨。今天,我們來聊一聊測試人員想要進階,想要做自動化測試,甚至測試開發,如何選擇編程語言。前言自動化測試,這幾年行業內的熱詞,也是測試人員進階的必備技能,更是軟件測試未來發展的趨勢?!?/div>
      • 如何獲取Yarn和Spark UI的界面索引信息
        1閱讀 0條評論 個贊
        .css-1yuhvjn{margin-top:16px;}.css-3jt6os.FileLinkCard{-webkit-align-items:center;-webkit-box-align……
      • 內存泄漏——原因、避免和位置
        0閱讀 0條評論 個贊
        .css-1yuhvjn{margin-top:16px;}.css-3jt6os.FileLinkCard{-webkit-align-items:center;-webkit-box-align……
      • 全網最全Linux命令匯總!(史上最全 推薦收藏)
        7閱讀 0條評論 個贊
        今天,給小伙伴們帶來一篇史上最全Linux命令總結的文章,命令有點多,建議小伙伴們先收藏后閱讀。好了,我們開始今天的正文。列出目錄內容ls-a:顯示所有文件(包括隱藏文件);ls-l:顯示詳細……
      • 轉:Java老了 科特林會取而代之嗎?
        0閱讀 0條評論 個贊
        .css-1yuhvjn{margin-top:16px;}.css-3jt6os.FileLinkCard{-webkit-align-items:center;-webkit-box-align……
      • Java內存區(運行時數據區)簡介
        0閱讀 0條評論 個贊
        Java虛擬機在執行Java程序的過程中會把它管理的內存劃分成若干個不同的數據區域。JDK1.8和之前的版本略有不同。下圖是JDK1.8對JVM做的改動,把方法區的具體實現----元空……
      • 讓自己更有價值的5種能力
        0閱讀 0條評論 個贊
        如何讓自己更值錢?回答這個問題,需要用到黃金圈理論。什么是黃金圈理論?黃金圈理論,是國際知名營銷專家、作家SimonSinek在2011年提出的,這是一種由內向外的思維模式。黃金圈理論提倡由Why、……
      • 面試問題:Java序列化和反序列化
        0閱讀 0條評論 個贊
        目錄序列化和反序列化的概念應用場景?序列化實現的方式繼承Serializable接口,普通序列化繼承Externalizable接口,強制自定義序列化serialVersionUID的作用靜態變量不會……
      • 構建docker鏡像庫(1):用注冊表構建本地鏡像庫
        0閱讀 0條評論 個贊
        目錄一.系統環境二.前言三.使用registry搭建私有鏡像倉庫3.1環境介紹3.2k8smaster節點配置鏡像倉庫3.3k8sworker1節點配置從私有倉庫上傳和拉取鏡像3.3.1上傳鏡……
      • c#異步高級————通道[1]
        0閱讀 0條評論 個贊
        前言該系列為異步編程的進階篇,其實也不能這么講。世界上本沒有進階篇,只能說是高級篇(高級篇不能說多高級,是對底層的封裝的意思),只要是加深理解都是進階。本章先介紹一下channel。正文下面沒什么好說……
      • Javascript的異步循環打印主題
        0閱讀 0條評論 個贊
        這道題,我相信很多前端從業者都知道,它本質上來說并不復雜,但是卻可以有很深遠的擴展,最終核心的主題其實就是異步的執行,其中對于題目的解法,還涉及到一些作用域的知識。那么我們以最簡版的題目入手,逐步深入……
      • 基于 網絡6的輕量級Webapi框架緊固點
        0閱讀 0條評論 個贊
        大家好,我是等天黑。FastEndpoints是一個基于.NET6開發的開源webapi框架,它可以很好地替代.NETMinimalAPIs和MVC,專門為開發效率而生,帶來了全……
      • SQL Server 2005分區模板和實例
        0閱讀 0條評論 個贊
        一、場景這一段時間使用SQLServer2005對幾個系統進行表分區,這幾個系統都有一些特點,比如數據庫某張表持續增長,給數據庫帶來了很大的壓力?,F在假如提供一臺新的服務器,那么我們應該如何規劃……
      • 【云原生】-碼頭工人容器遷移神諭到關系型數據庫
        0閱讀 0條評論 個贊
        文章目錄前言??1.創建專用網絡??2.Oracle12C部署?2.1鏡像下載?2.2容器創建?2.3創建業務用戶?2.4監聽啟動??3.MySQL8部署?3.1容器……
      • 深入理解Redis數據結構-字典
        0閱讀 0條評論 個贊
        字典,又稱為符號表、關聯數組或映射,是一種用于保存鍵值對的抽象數據結構。在字典中,一個鍵可以和一個值進行關聯,這些關聯的鍵和值稱為鍵值對。鍵值對中鍵是唯一的,我們可以根據鍵key通過映射查找或者更新對……
      • 金牛座入門 MVC微服務框架開發教程:項目部署:4 微服務應用發布到Docker進行部署
        0閱讀 0條評論 個贊
        前言:本篇教程,演示ASP.NETCore微服務應用程序,如何最簡方式發布到Docker中部署,并運行起來。新手兩個簡易概念:1、映像:可以理解為Class,用于定義;2、容器:可以理解為Clas……
      • 教大家如何處理Spring Boot易流中的用戶和群體!
        0閱讀 0條評論 個贊
        1.準備工作2.用戶操作2.1添加用戶2.2修改用戶2.3刪除用戶2.4查詢用戶3.組操作3.1添加組3.2修改組3.3刪除組3.4查詢組4.查看表詳情雖然說我們在實際開發中,……
      • 解決ShardingJdbc不支持復雜SQL問題的說明
        18閱讀 0條評論 個贊
        背景介紹公司最近做分庫分表業務,接入了ShardingJDBC,接入完成后,回歸測試時發現好幾個SQL執行報錯,關鍵這幾個表都還不是分片表。報錯如下:這下糟了嘛。熟悉ShardingJDB……
      最近發布資訊
      更多
      警花高潮嗷嗷叫
      <del id="nnjnj"></del><track id="nnjnj"></track>

      <p id="nnjnj"></p>

      <address id="nnjnj"></address>

        <pre id="nnjnj"><pre id="nnjnj"></pre></pre>

          <noframes id="nnjnj"><ruby id="nnjnj"><ruby id="nnjnj"></ruby></ruby>