MySQL架構體系設計深入剖析篇學習筆記

MySQL存儲引擎InnoDB原理拆解以及設計深度剖析

MySQL記錄存儲以Page(頁)來劃分土居。
頁頭:記錄頁面的控制信息派桩,共占56字節(jié)阴挣,包含頁的左右兄弟頁面指針断序、頁面空間使用情況等年栓。
虛記錄:最大虛記錄:比頁面最大主鍵還大拆挥。 最小虛記錄:比頁面最大主還小。
記錄堆:行記錄存儲區(qū)
自由空間鏈表:鏈表關聯(lián)被刪除的記錄用來重復利用空間
未分配空間:頁面未使用的存儲空間某抓。
Slot區(qū):
頁尾:存儲頁面的校驗信息8個字節(jié)纸兔。

頁內記錄維護
  1. 順序保證
  • 物理有序:非順序插入需要移動數(shù)據(jù),插入效率較低否副,查找效率高汉矿。
  • 邏輯有序:物理無序,鏈表連接邏輯數(shù)據(jù)备禀,插入效率高洲拇,查找效率低。
  • InnoDB采用的邏輯有序曲尸,在查詢中有進行優(yōu)化赋续。

page 與 page關聯(lián), 主鍵和主鍵關聯(lián)組成順序另患。

  1. 插入策略
  • 自由空間鏈表:InnoDB優(yōu)先使用
  • 未使用空間:
  1. 頁內查詢
  • 遍歷:邏輯有序
    通過最小虛記錄->最小rec->逐漸遞增->最大虛記錄
    Slot 按照一定規(guī)律指向rec纽乱,可以對記錄按照一定規(guī)律進行做類似二分加快查找。
MySQL InnoDB存儲引擎內存管理
  1. 預分配內存空間 以塊形式加載
  2. 數(shù)據(jù)以頁為單位加載
  3. 數(shù)據(jù)內外存交換 將內存塊內容發(fā)生改變后寫入磁盤柴淘,從磁盤加載新的塊加載入硬盤
  4. 內存池
  5. 頁面映射 磁盤動態(tài)映射到內存上
  6. 頁面數(shù)據(jù)管理
    1. 空閑頁
    2. 數(shù)據(jù)頁
    3. 臟頁:被修改后的內存頁迫淹,要將其寫入磁盤。
  7. 數(shù)據(jù)淘汰(數(shù)據(jù)內外存交換) 內存頁都被使用的情況下或需要加載新的數(shù)據(jù)時为严。
    1. LRU 最長時間最久沒有被使用的數(shù)據(jù)淘汰掉敛熬,使用鏈表結構。
    2. 保證鏈尾最長時間沒有使用:每次訪問鏈表數(shù)據(jù)時第股,將該數(shù)據(jù)放到鏈表頭应民,就可以保證鏈表最尾為最長時間沒有被使用。
    3. 為了解決避免熱數(shù)據(jù)被淘汰:訪問時間+頻率。(redis采用方式)
    4. 兩個LRU表诲锹。一級LRU做內存加載繁仁,二級LRU存放一級LRU特定等級的熱數(shù)據(jù)。

8.InnoDB采用的方式:
Buffer Pool 預分配的內存池
Page Buffer Pool的最小單位
Free List 空間page組成的鏈表
Flush list 臟頁鏈表
Page hash表 維護內存page和文件page的映射關系
LRU 內存淘汰算法:

LRU

(head)LRU_new(tail):(head)LRU_old(tail)以5比3的比例Midpoint指針進行冷熱分離
LRU_new
LRU_old
Midpoint

  1. 頁面裝載: 磁盤數(shù)據(jù)到內存归园,插入到LRU_old頭部
  2. 頁面淘汰: Free list中取> LRU中淘汰 > LRU Flush黄虱,將要淘汰的數(shù)據(jù)放入 Free List
    3. old 到 new:定義熱數(shù)據(jù)的移動 innodb_old_blocks_time: old區(qū)存活時間大于此值,有機會進入new區(qū)庸诱。存活時間+訪問頻率
  3. new 到 old:由Midpoint始終指向8/5位置來區(qū)分冷熱數(shù)據(jù)捻浦,并結合
    free_page_clock:Buffer Pool淘汰頁數(shù)
    LRU_new長度1/4
    當前freed_page_clock-上次移動到Header時freed_page_clock LRU_new 長度1/4

MySQL設計思路:減少移動次數(shù)

MySQL事務實現(xiàn)原理拆解以及設計深度剖析

事務特性
  • A:原子性 全部成功或全部失敗
  • I:隔離性 并行事務之間互不干擾
  • D:持久性 事務提交后數(shù)據(jù)改變是永久性的
  • C:一致性 數(shù)據(jù)中間狀態(tài)對外不可見,只有最初狀態(tài)和最終狀態(tài)可見
并發(fā)問題
  • 臟讀: 讀取到未提交的數(shù)據(jù)
  • 不可重復讀: 兩次讀取結果不同
  • 幻讀: select操作的到的結果所表征的數(shù)據(jù)狀態(tài)無法支持后續(xù)的業(yè)務操作
隔離級別
  • 讀取未提交內容 RU:最低隔離級別桥爽,會讀到其他事務未提交的數(shù)據(jù)(臟讀)
  • 讀取提交內容 :事務過程中可以讀取到其他事務已提交的數(shù)據(jù)(不可重復讀)
  • 可重復讀 RR:每次讀取相同結果集朱灿,不管其他事務是否提交(幻讀)
  • 串行化:事務排隊,隔離級別最高钠四,性能最差
MySQL事務實現(xiàn)原理
  • MVCC

    • 多版本并發(fā)控制:解決讀寫沖突盗扒,有兩個隱藏列
    • 當前讀:讀當前版本
    • 快照讀:讀歷史版本
      • 可見性判斷:創(chuàng)建快照這一刻,還未提交的事務缀去。 創(chuàng)建快照之后創(chuàng)建的事務侣灶。
      • Read View: 快照讀 活躍事務列表。 列表中最小事務ID朵耕。 列表中最大事務ID炫隶。
  • undo log

    • 回滾日志
    • 保證事務原子性
    • 實現(xiàn)數(shù)據(jù)多版本
    • delete undo log淋叶;用于回滾阎曹,提交即清理
    • update undo log:用于回滾,同時實現(xiàn)快照讀煞檩,不能隨便刪除
  • redo log

    • 實現(xiàn)事務持久性

    • 記錄修改

    • 用于異炒ο樱恢復

    • 循環(huán)寫文件

      • Write Pos:寫入位置
      • Check Point:刷盤位置
      • Check Point -> Write pos: 待落盤數(shù)
    • 寫入流程:

      • 記錄頁的修改, 狀態(tài)為prepare斟湃。
      • 事務提交熏迹,講事務記錄為commit狀態(tài)。
    • 刷盤時機:

      • innodb_fulsh_log_at_trx_commit 0/1/2
    • 意義:

      • 體積小凝赛,記錄頁的修改注暗,比寫入頁代價低。
      • 末尾追加墓猎,隨機寫變順序寫捆昏,發(fā)生改變的頁不固定。

MySQL鎖實現(xiàn)原理拆解以及設計深度剖析

InnoDB鎖種類
  • 鎖粒度:
    • 行級鎖
      • 作用在索引上
      • 聚簇索引和二級索引
    • 間隙鎖:鎖一個范圍
      • 解決可重復讀模式下的幻讀問題
      • GAP鎖不是加在記錄上
      • GAP鎖鎖住的位置毙沾,是兩條記錄之間的GAP
      • 保證兩次當前讀返回一致的記錄骗卜。
    • 表級鎖
      • RC級別全表掃描“鎖表”,所有記錄加鎖后返回,然后由MySQL Server層進行過濾寇仓。
      • RR級別全鎖举户,會造成性能大幅下降。
  • 類型:
    • 共享鎖

    • 排它鎖(寫鎖)
      當前讀:select for update 遍烦、update 俭嘁、delete,為了更新需要加行級鎖服猪。
      有沒有索引/唯一索引/非唯一索引/隔離等級(RC/RR)四種情況來分析鎖
      RC會出現(xiàn)幻讀(刪除時插入非唯一索引記錄兄淫,刪除后還可以查到)。

    • 死鎖:
      并發(fā)事務蔓姚,互相擁有對方需要加鎖對象的鎖捕虽,導致加鎖失敗。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末坡脐,一起剝皮案震驚了整個濱河市泄私,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌备闲,老刑警劉巖晌端,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異恬砂,居然都是意外死亡咧纠,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門泻骤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來漆羔,“玉大人,你說我怎么就攤上這事狱掂⊙菅鳎” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵趋惨,是天一觀的道長鸟顺。 經常有香客問我,道長器虾,這世上最難降的妖魔是什么讯嫂? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮兆沙,結果婚禮上欧芽,老公的妹妹穿的比我還像新娘。我一直安慰自己挤悉,他們只是感情好渐裸,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布巫湘。 她就那樣靜靜地躺著,像睡著了一般昏鹃。 火紅的嫁衣襯著肌膚如雪尚氛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天洞渤,我揣著相機與錄音阅嘶,去河邊找鬼。 笑死载迄,一個胖子當著我的面吹牛讯柔,可吹牛的內容都是我干的。 我是一名探鬼主播护昧,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼魂迄,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了惋耙?” 一聲冷哼從身側響起捣炬,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绽榛,沒想到半個月后湿酸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡灭美,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年推溃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片届腐。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡铁坎,死狀恐怖,靈堂內的尸體忽然破棺而出梯捕,到底是詐尸還是另有隱情厢呵,我是刑警寧澤窝撵,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布傀顾,位于F島的核電站,受9級特大地震影響碌奉,放射性物質發(fā)生泄漏短曾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一赐劣、第九天 我趴在偏房一處隱蔽的房頂上張望嫉拐。 院中可真熱鬧,春花似錦魁兼、人聲如沸婉徘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盖呼。三九已至儒鹿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間几晤,已是汗流浹背约炎。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蟹瘾,地道東北人圾浅。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像憾朴,于是被迫代替她去往敵國和親狸捕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內容